Использование sed для добавления строки из шаблона регулярных выражений в тот же файл - PullRequest
1 голос
/ 17 мая 2019

Я новичок в программировании Unix, таких как sed, perl и т. Д. Я искал и не нашел результата, соответствующего моему случаю. Мне нужно добавить подстроку из верхней строки в том же файле. Содержимое моего файла text.txt:

Name: sur.name.custom
Tel: xxx
Address: yyy
Website: www.site.com/id=
Name: sur.name.custom1
Tel: xxx
Address: yyy
Website: www.site.com/id=

Мне нужно добавить каждое имя (sur.name. *) К каждому веб-сайту в его блоке. Итак, ожидаемый выход:

Name: <b>sur.name.custom</b>
Tel: xxx
Address: yyy
Website: www.site.com/id=<b>sur.name.custom</b>
Name: <b>sur.name.custom1</b>
Tel: xxx
Address: yyy
Website: www.site.com/id=<b>sur.name.custom1</b>

Я пробовал следующую команду sed:

sed -n "/^Website:.*id=$/ s/$/sur.name..*/p" ./text.txt;

Но sed вернулся: Веб-сайт: www.site.com/id=sur.name.* ту же строку, которую я поставил. Я уверен, что sed может добавить из регулярных выражений. Мне нужны как sed, так и perl, если это возможно.

Ответы [ 2 ]

3 голосов
/ 18 мая 2019

Вот решение sed:

sed '/^Name:/{h;s/Name: *//;x;};/^Website:/{G;s/\n//;}' filename

Перевод: если строка начинается с Name:, сохраните имя в поле удержания; если строка начинается с Website:, добавьте (последнее) имя из области ожидания.

3 голосов
/ 17 мая 2019

Почему бы вам не использовать awk для этого?Предполагая, что имена не содержат пробелов, должна работать следующая команда:

awk '$1=="Name:"{name=$2} $1=="Website:"{print $0 name;next} 1' file

Эквивалент Perl:

perl -pale'
   $F[0] eq "Name:"    and $name = $F[1];
   $F[0] eq "Website:" and $_ .= $name;
' file

(Разрывы строки могут быть удалены.)

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