bash: как заменить только одно поле, если две строки имеют одинаковое содержимое в этом поле - PullRequest
0 голосов
/ 08 августа 2011

Хорошо, это сводит меня с ума.

У меня есть 4 поля, разделенные двоеточиями. Я пытаюсь заменить только последнее поле переменной. но проблема в том, что когда две строки имеют одинаковое содержание, обе они будут изменены. Я думал, смогу ли я дать sed ссылку на то, какую строку я хочу изменить. Другими словами, если первое поле - R2, тогда замените его последнее поле

файл:

R1:name1:date1:black
R2:name2:date2:black

Я хочу, чтобы это было так

R1:name1:date1:black
R2:name2:date2:black2

Вот что у меня есть

Переменной

уже присвоено четвертое поле. пользователю было присвоено имя zenity для ввода имени.

variable=$(awk -F ":" '$2 ~ /'"$name"'/ {print $4}' file)

sed -i 's/'$variable'/black2/g' file

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 08 августа 2011

Или решение с помощью awk, но без возможности изменить файл вместо как sed, поэтому необходим mv:

awk -F ":" '($1 == "R2" && $4 == "black"){print $1 ":" $2 ":" $3 ":black2"} ($1 != "R2" || $4 != "black"){print $1 ":" $2 ":" $3 ":" $4}' file > file1
mv file1 file

или, может быть, короче:

awk -F ":" '{print $1 ":" $2 ":" $3 ($1 == "R2" && $4 == "black"? ":black2" : ":" $4)}' file > file1
mv file1 file
2 голосов
/ 08 августа 2011

Вы можете ограничить, к каким строкам sed применяется подстановка:.

Редактировать : Я удалил аргумент g для sed, так как для каждой строки требуется одиночная замена.Аргумент g применяется к строкам, а не к общему вводу.

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