【问题标题】:Search for a particular string, extract a number and add few strings below containing that number搜索特定字符串,提取一个数字并在下面添加几个包含该数字的字符串
【发布时间】:2016-09-18 02:15:37
【问题描述】:

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

!
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,并在该行中用grep 查找serial_* 之后结尾的数字。将该数字存储在变量中并使用该数字创建我的内容。在hello-domain 行下方添加我准备好的内容。

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

【问题讨论】:

  • 嗨,Dorothy... 向我们展示您的尝试,否则我们会认为我们在为您工作(免费)。你来这里是为了学习,而不是让别人做你的工作。

标签: shell unix sed grep


【解决方案1】:

使用 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:]]+) 的行。因为该正则表达式在括号中,所以这些数字保存在第 1 组中。

当找到这样的匹配行时,将其替换为自身,&,后接换行符,\n,后接my_content xxxx.,后接组 1,\1,后接换行符,@ 987654330@,后接my_another_content yyyy.,后接组1,\1

使用 awk

$ 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}

    对于与正则表达式hello-domain serial_ 匹配的任何行,我们还会再打印两行,每行后跟当前行的最后一个字段(即数字)。

【讨论】:

  • 谢谢:)。还有一件事。我试图将 sed 命令的结果复制到另一个文件中。但毕竟“!”我得到了^M。如何解决?
  • @DorothyP ^M 是 Windows 回车符。您可以使用 dos2unix 等命令行工具删除它们。
  • @DorothyP 这表明该文件最初是一个 Windows 文件。当 sed 命令完成后,您希望它保持为 Windows 格式的文件还是成为 Unix 格式的文件?
  • 再次感谢。工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 2020-01-06
相关资源
最近更新 更多