Команда sed для замены определенного значения после нахождения определенного шаблона - PullRequest
0 голосов
/ 09 октября 2011

Я немного застрял с командой Unix.

У меня есть файл file.txt со следующим содержимым:

customer1

имя = Alice

передача = Юникс

DOB =

Customer2

имя = Destroyer

пасс = окна

д.р. =

Что я в основном хочу, так это использовать команду unix, которая позволила бы мне выполнить поиск клиента (например, Customer1), а затем присвоить его dob значение, например, dob = 1912

поэтому файл file.txt станет похож на

customer1

имя = Alice

передача = Юникс

д.р. = 1912

Я работал с sed, вот команда, которую я сформулировал:

sed "s / $ (awk 'c -> 0; / Customer1 / {c = 3}' file.txt | tail -1) / dob = 1234 / g" -i file.txt

Это, однако, заменит ВСЕ вхождения dob на dob = 1234 (вполне очевидно).

Может ли кто-нибудь дать мне подсказку о том, как заблокировать конкретную учетную запись для каждого клиента и заменить ее?

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

Ответы [ 3 ]

1 голос
/ 09 октября 2011

awk может сделать это самостоятельно. см. один вкладыш ниже:

 awk 'BEGIN{RS="dob=";OFS="\n\n"}$1~/Customer1/{$0=$0"dob=1234";print}' input

test : изменить значение dob customer1 на 7777:

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=

Customer2

name=Destroyer

pass=windows

dob=

kent$  awk 'BEGIN{RS="dob=";OFS="\n\n"}$1~/Customer1/{$0=$0"dob=7777";print}' t.txt

Customer1

name=Alice

pass=unix

dob=7777

Последнее обновление:

kent$  awk 'BEGIN{RS="dob=";OFS="\n\n"}$1~/Customer1/{$0=$0"dob=7777";print > "t.txt"}' t.txt

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=7777

обновлено снова

kent$  awk '/Customer1/{a++;}/dob=/&&a{$0="dob=7777";a=0;}1' t.txt > tmp.txt && mv tmp.txt t.txt

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=7777

Customer2

name=Destroyer

pass=windows

dob=

обновлено с помощью sed на самом деле, использование sed (с удобной опцией -i) также возможно. Я не правильно понял ваше требование, я думал, что вы хотите только конкретный блок клиента. поэтому я выбрал awk. Теперь выходит версия sed:

kent$  sed -ir '/Customer1/{x;s/.*/a/;x;} 
/dob=/{x;
        /a/{s/a//g; x;
                s/.*/dob=1234/; x;};
        x}' t.txt

kent$  cat t.txt
Customer1

name=Alice

pass=unix

dob=1234

Customer2

name=Destroyer

pass=windows

dob=
0 голосов
/ 09 октября 2011

В этом случае использование awk может помочь:

 searchfor=Customer1
 replacefield=dob
 newvalue=1912

 awk -F'=' '
   /^'"$searchfor"'$/ { do_something = 1 }
   do_something && $1 == "'"$replacefield"'" { print $1 "='"$newvalue"'"; do_something = 0; next }
   { print }
 ' dat1
0 голосов
/ 09 октября 2011

Вы можете использовать сопоставление с образцом awk для ограничения диапазона строк.Например, (при условии, что ваш входной файл использует «user» вместо «name», как вы приводите оба примера):

$ awk /user=alice/,/^Customer/{ if( $0 == "dob=" ) $0="dob=1234"} {print} file.txt

Следует заменить dob Алисы на «1234»

Если у вас есть gnu sed, вы можете использовать -i для замены текста в файле (протестируйте его перед тем, как сделать это).Или используйте перенаправления по мере необходимости.

...