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 - 在两个字符串之间的匹配模式后插入带文本的行的主要内容,如果未能解决你的问题,请参考以下文章