这是我的文本文件的外观:
!
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
行下方添加我的现成内容。
我不知道从哪里开始。欢迎任何帮助我开始编写程序的提示。
答案 0 :(得分:0)
尝试:
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.
。
\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}
匹配的任何行,我们还会再打印两行,每行后跟当前行的最后一个字段(即数字)。