Sed - 在两个字符串之间的匹配模式后插入带文本的行

Posted

技术标签:

【中文标题】Sed - 在两个字符串之间的匹配模式后插入带文本的行【英文标题】:Sed - Insert line with text after match pattern between two strings 【发布时间】:2021-02-13 03:27:48 【问题描述】:

我只想在两个模式之间的块中插入带有特定字符串的文本。 输入文件示例:

text text
text text
...
[textabc pattern 1]
text text
text text
xyz = 123 #below this string I want to insert new text
text text
[textdef pattern 2]
text text
text text

我想在“xyz = 123”行下方插入“新字符串”,但前提是字符串介于“[textabc 模式 1]”和“[textdef 模式 2]”之间。 输出文件:

text text
text text
...
[textabc pattern 1]
text text
text text
xyz = 123
NEW STRING
text text
[textdef pattern 2]
text text
text text

我尝试过这样的事情:

sed -i '/^\[textabc pattern 1\]$/,/^\[textdef pattern 2\]/ ^xyz .*/a NEW STRING/' /folder/file.txt

如何使用 sed 做到这一点?

【问题讨论】:

似乎您需要编写一个脚本并遍历文件两次。有一个布尔标志来指示您是否找到“开始”标签,一个 int 来指示所需文本的行号,然后如果您在另一个开始标签之前找到一个“结束”标签,您将存储行号。再次通过文件并在以下行号上添加新文本。如果有多个,则必须增加存储的行号。我个人会使用 Python。如果您需要帮助,请告诉我。 请提供更清晰的样本,以便我们更清楚地了解您的问题,谢谢。 【参考方案1】:

数据集:

$ cat test.txt
text text
text text
[textabc pattern 1]
text text
text text
xyz = 123
text text
[textdef pattern 2]
text text
text text

对 OP 当前 sed 命令的一些小改动:

# current

sed     '/^\[textabc pattern 1\]$/,/^\[textdef pattern 2\]/ ^xyz .*/a NEW STRING/' test.txt

# new/proposed (2 lines); the 'a'ppend option requires a new line before the end ''

sed  -e '/^\[textabc pattern 1\]$/,/^\[textdef pattern 2\]//^xyz .*/aNEW STRING
' test.txt

# new/proposed (1 line); break into 2 segments via a 2nd '-e' flag to eliminate need for embedded newline character

sed  -e '/^\[textabc pattern 1\]$/,/^\[textdef pattern 2\]//^xyz .*/a'"NEW STRING" -e '' test.txt

上述两个新的/建议的sed 命令生成以下内容:

text text
text text
[textabc pattern 1]
text text
text text
xyz = 123
NEW STRING
text text
[textdef pattern 2]
text text
text text

注意:一旦 OP 对结果感到满意,就可以重新引入 -i 标志以允许 sed 对数据文件进行就地更改。

【讨论】:

你打败了我。 :) 第一个建议不起作用 - 出了点问题。或者我做错了什么。第二个建议 - 很好。谢谢。 re:第一个建议:没有看到您尝试运行的实际代码,我猜您尝试将命令作为单行运行......它 跨 2 行完成(即,NEW STRING 之后必须有一个换行符) @markp-fuso 我有类似的问题,但我只需要查看一个块,所以基本上我需要删除它包含[textdef pattern 2] 的部分。你能帮我修改一下你的单行解决方案吗? @shashwat 我建议你问一个新问题,确保提供正常的东西......示例输入,你尝试过的代码,你的代码生成的(错误的)输出和(正确的) ) 预期产出;问候【参考方案2】:

这可能对你有用(GNU sed):

sed '/\[textabc pattern 1\]/               # match the first pattern
     :a                                     # loop name
     N                                      # append next line
     /\[textdef pattern 2\]/!ba             # match the second pattern or repeat
     s/^xyz = 123.*$/&\nNEW STRING/m' file # match third pattern and append

【讨论】:

以上是关于Sed - 在两个字符串之间的匹配模式后插入带文本的行的主要内容,如果未能解决你的问题,请参考以下文章

需要帮助在 macOS 上使用 sed 在两次连续匹配后插入文本 [关闭]

sed / awk - 使用模式匹配后插入空格

使用 sed 在第 N 个匹配模式之后插入一些文本

Sed 实记 · laoless‘s Blog

sed编辑命令

linux学习--grep与sed