sed: поиск и замена изменяющегося столбца - PullRequest
0 голосов
/ 22 сентября 2009

Я получил документ, что поля разделены двоеточием (:), где мне нужно время от времени менять второе поле. Документ выглядит так:

name1:UhX.PPFW7$YhPMH0BISY:23490::::::
name2:1./0oV$GEs6WJpE$LHXhy:19239:0:29388:2::29302:
...

Второе поле файла иногда меняется и может содержать пару символов регулярного выражения ($.) И косую черту.

Я бы хотел заменить только второе поле, поскольку данные, которые следуют за ним, могут в будущем измениться. Если я сделаю:

sed -e "s~^name2:.*:~name2:aTest\$repl.ace:~g" tst

Текст справа от второго столбца утерян:

name2:aTest$repl.ace:

(т. Е. '19239: 0: 29388: 2 :: 29302:'). Есть ли способ, которым sed может заменить изменяющийся столбец и сохранить остальную часть строки? Или, возможно, есть лучшая программа для этого?

Ответы [ 3 ]

0 голосов
/ 22 сентября 2009

Попробуйте это:

perl -pe 's~^name2:.*?:~name2:aTest\$repl.ace:~g' test
0 голосов
/ 22 сентября 2009

Самый простой способ - изменить. * В вашем регулярном выражении так, чтобы он соответствовал только тому, что действительно может появиться во втором поле, например:

sed -e "s~^name2:[^:]*:~name2:aTest\$repl.ace:~g" tst

([^:] * == все, что не содержит двоеточия), или:

sed -e "s~^name2:[$./0-9a-zA-Z]*:~name2:aTest\$repl.ace:~g" tst

([бла] * == любое количество символов в списке)

0 голосов
/ 22 сентября 2009

Sed, вероятно, не лучший инструмент для этого, потому что если действительно не знает о полях. Рассмотрим awk (который имеет встроенную концепцию полей):

$ awk -F : 'NF>=2{split($0,a,":");a[2]="new sting";printf(a[1]);for(i=2;i<=NF;i++){printf":%s",a[i]};printf("\n");}' <input file>

или отформатирован для удобства чтения:

awk -F : 'NF>=2 {
                   split($0,a,":");
                   a[2]="new sting";
                   printf(a[1]);
                   for(i=2;i<=NF;i++){
                     printf":%s",a[i]
                   };
                   printf("\n");
                 }' <input file>

Для простоты вы можете заменить ":" на FS. Также стоит обратить внимание на t его join функцию , которая сделает реализацию чище, если вы пишете скрипт, а не работаете в командной строке.

В данной реализации предполагается, что вы хотите заменить все вторыми полями. Если вам нужно выбрать только некоторые из линий для замены, измените шаблон на

$2=="string to match"

или

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