使用sed将正则表达式模式的字符串追加到同一文件中

时间:2019-05-17 15:54:53

标签: perl sed

我是不熟悉sed,perl等unix编程的人。我已经搜索过,但没有找到符合我情况的结果。我需要在同一文件的顶行附加子字符串。我的文件内容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: sur.name.custom
Tel: xxx
Address: yyy
Website: www.site.com/id=sur.name.custom
Name: sur.name.custom1
Tel: xxx
Address: yyy
Website: www.site.com/id=sur.name.custom1

我尝试了以下sed命令:

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

但是sed返回了:网站:www.site.com/id=sur.name。*我输入了相同的字符串。 我确信sed可以从正则表达式模式中追加。如果可能,我需要sed和perl。在此先感谢!

2 个答案:

答案 0 :(得分:3)

您为什么不为此使用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

(可以删除换行符。)

答案 1 :(得分:3)

这是一个解决方案:

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

翻译:如果该行以Name:开头,则将该名称保存到保留空间;如果该行以Website:开头,请在保留空间中附加(最新)名称。