1

У меня есть следующая команда, которая дает мне 99% того, что я хочу:

root@CA2UA5232QPZ:/# tail -3 newtag | awk '{print $1}'
v1.0.20170512.1
v1.0.20170712.1
v1.0.20170712.2
root@CA2UA5232QPZ:/#

Но мне нужно настроить его так, чтобы результат выглядел так:

'v1.0.20170512.1'
'v1.0.20170712.1'
'v1.0.20170712.2'

4 ответа4

3

Там отвратительная оболочка, цитирующая ад этих

awk '{print "'"'"'" $1 "'"'"'"}'
awk '{print "'\''" $1 "'\''"}'

или используйте нечетный разделитель выходного поля

awk -v OFS="'" '{print "", $1, ""}'

но это не так уж плохо

awk -v q="'" '{print q $1 q}'
2

Вы можете передать свой вывод в sed:

tail -3 newtag| awk '{print $1}'| sed "s/^/'/;s/$/'/"
2

Другой способ, используя шестнадцатеричный код ASCII для ':

tail -3 newtag | awk '{print "\x27" $1 "\x27" }'
0

1. Один проход с sed:

tail -3 newtag | sed "s/\(.*\)\s.*/'\1'/"

Пояснение: в sed строка замены не должна быть заключена в кавычки

2. Или вы можете использовать perl:

tail -3 newtag | perl -anE "say qq('\$F[0]')"

Объяснение:

  • язык сценариев perl который выделяется при обработке текста
  • -a разделить каждую строку в полях
  • n не печатать автоматически каждую строку
  • E выполните следующую команду и включите такие функции, как, say
  • " с " , потому что позже мы хотим использовать '
  • say напечатать следующее выражение и перевод строки
  • qq( начало литерального выражения, допускающего интерполяцию переменных
  • ' буквальный '
  • \$F[0] первое "поле" в строке
  • ' буквальный '
  • ) конец буквального выражения
  • " конец инструкции

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .