bash-скриптинг: могу ли я получить sed для вывода оригинальной строки, затем пробела, затем модифицированной строки? - PullRequest
0 голосов
/ 27 мая 2019

Я новичок в Unix во всех его формах, поэтому, пожалуйста, будьте осторожны со мной!У меня есть сценарий bash, который передаст команду ls с произвольными именами файлов в sed, которая будет использовать произвольный шаблон замены для файлов, а затем он будет передан в awk для некоторой обработки.Уловка в том, что awk нужно знать как оригинальное имя файла, так и новое.

Мне удалось все, кроме ввода оригинальных имен файлов в awk.Например, предположим, что мои файлы являются test. *, А шаблон замены - 's: es: ar;', который будет заменять каждое вхождение "test" на "tart".В целях тестирования я просто использую awk для вывода того, что он получает:

ls "$@" | sed "$pattern" | awk '{printf "0: %s\n1: %s\n2: %s\n", $0,$1,$2}'

, где test. * В $ @, а шаблон хранится в $ pattern.Ясно, что это не приведет меня туда, где я хочу быть.Вывод, очевидно,

0: tart.c
1: tart.c
2:

Если бы я мог получить sed для вывода "test.c tart.c", то у awk было бы два параметра.Я поиграл с шаблоном безрезультатно, даже жестко закодировал "test.c" в замену.Но, конечно, это дало мне любительские результаты, такие как "ttest.c art.c".Возможно ли, чтобы sed запомнил ввод, а затем включил его в начало вывода?У меня даже есть правильные идеи?Заранее спасибо!

Ответы [ 3 ]

1 голос
/ 27 мая 2019

Дублируйте, измените первое слово и поменяйте местами:

echo test.c |  sed -r 's/.*/& &/;s/t/b/;s/([^ ]*) (.*)/\2 \1/'

или с большей магией

echo test.c |  sed 'h;s/t/b/;x;G;s/\n/ /'
0 голосов
/ 28 мая 2019
$ echo 'foo' | awk '{old=$0; gsub(/o/,"e"); print old, $0}'
foo fee
0 голосов
/ 27 мая 2019

Используйте Perl вместо sed:

echo test.c | perl -lne 'print "$_ ", s/es/ar/r'

-l удаляет символ новой строки из ввода и добавляет его после каждого print. Модификатор /r для подстановки возвращает измененную строку вместо изменения переменной (необходим Perl 5.14+).

Старый ответ, не работает для s/t/b/2 или s/.*/replaced/2:

Вы можете продублировать содержимое строки с помощью s/.*/& &/, а затем просто сказать sed, что он должен применять только вторую подстановку (это работает по крайней мере в GNU sed):

echo test.c | sed 's/.*/& &/; s/es/ar/2'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...