搜索特定字符串,提取数字并在下面添加包含该数字的几个字符串

时间:2016-09-18 02:15:38

标签: shell unix sed grep

这是我的文本文件的外观:

!
hello_group serial_1234
hello-domain serial_1234
!
!
hello_group serial_2345
hello-domain serial_2345
!

这就是我想看到结果的方式:

!
hello_group serial_1234
hello-domain serial_1234
my_content xxxx.1234
my_another_content yyyy.1234
!
!
hello_group serial_2345
hello-domain serial_2345
my_content xxxx.2345
my_another_content yyyy.2345
!

我想搜索hello-domain并在该行中搜索serial_*之后结束的数字。将该数字存储在变量中并使用该数字创建我的内容。在hello-domain行下方添加我的现成内容。

我不知道从哪里开始。欢迎任何帮助我开始编写程序的提示。

1 个答案:

答案 0 :(得分:0)

使用sed

尝试:

sed -E 's/hello-domain serial_([[:digit:]]+)/&\nmy_content xxxx.\1\nmy_another_content yyyy.\1/' file

例如,输入数据:

$ sed -E 's/hello-domain serial_([[:digit:]]+)/&\nmy_content xxxx.\1\nmy_another_content yyyy.\1/' file
!
hello_group serial_1234
hello-domain serial_1234
my_content xxxx.1234
my_another_content yyyy.1234
!
!
hello_group serial_2345
hello-domain serial_2345
my_content xxxx.2345
my_another_content yyyy.2345
!

工作原理:

sed脚本由一个替换命令组成:

s/hello-domain serial_([[:digit:]]+)/&\nmy_content xxxx.\1\nmy_another_content yyyy.\1/

这会查找与hello-domain serial_匹配的行,后跟一个或多个数字([[:digit:]]+)。因为正则表达式是parens,所以这些数字保存在组1中。

如果找到这样的匹配行,则会将其替换为自身&,后跟换行符\n,然后是my_content xxxx.,后跟第1组,{{1} },后跟换行符\1,然后是\n,然后是第1组,my_another_content yyyy.

使用awk

\1

工作原理:

  • $ awk -F_ '{print} /hello-domain serial_/{print "my_content xxxx." $NF; print "my_another_content yyyy." $NF}' file ! hello_group serial_1234 hello-domain serial_1234 my_content xxxx.1234 my_another_content yyyy.1234 ! ! hello_group serial_2345 hello-domain serial_2345 my_content xxxx.2345 my_another_content yyyy.2345 !

    这会使-F_字段分隔符。因此,我们感兴趣的数字将是一行中的最后一个字段,以awk表示_

  • $NF

    打印每行输出。

  • print

    对于与正则表达式/hello-domain serial_/{print "my_content xxxx." $NF; print "my_another_content yyyy." $NF}匹配的任何行,我们还会再打印两行,每行后跟当前行的最后一个字段(即数字)。