У меня есть файл со следующим форматом:
A 485C72F95C72E15C EXTERNAL
B CC32480A3247F84A SYSTEM
C EC2A63F12A63B76C EXTERNAL
Я хочу отправить письмо в первом столбце, используя значение переменной «letter», и заменить значение во втором столбце со значением, которое я поставлю в переменной «id». Третья колонка может или не может отличаться или соответствовать в любом случае. Первый и второй столбцы никогда не будут содержать пробелов или специальных символов.
Я попытался использовать sed, но мой sed-fu не очень силен. Я придумал это:
letter=A
id=MYNEWIDSTRING
sed "/$letter /s/[^ ]*/$id/2"
Выход:
A MYNEWIDSTRING EXTERNAL
B MYNEWIDSTRING SYSTEM
C EC2A63F12A63B76C EXTERNAL
Идентификатор заменяется двумя строками, я предполагаю, что это связано с тем, что «A» совпадающий в конце исходной строки id.
Я знаю, что использовать sed -i для редактирования файла inplace, но не делать этого еще, поскольку моя команда все еще немного изворотладела.
Где я ошибался, или я должен использовать другой метод?
В любое время, когда вы имеете дело со структурированными данными, я бы использовал для awk или perl, а не sed.
Например
awk -v letter="A" -v id="MYNEWIDSTRING" '$1 == letter {$2=id}1' file
A MYNEWIDSTRING EXTERNAL
B CC32480A3247F84A SYSTEM
C EC2A63F12A63B76C EXTERNAL
или [ ! d3]
perl -alne '
BEGIN{$letter = shift; $id = shift;}
print join " ", $F[0], $F[0] eq $letter ? $id : $F[1], @F[2..$#F]
' 'A' 'MYNEWIDSTRING' file
Новые версии GNU awk имеют флаг -i (--in-place); в других вам нужно будет использовать явный временный файл; perl должен иметь -i в любом случае.