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

Posted

技术标签:

【中文标题】需要帮助在 macOS 上使用 sed 在两次连续匹配后插入文本 [关闭]【英文标题】:Need help inserting text AFTER two consecutive matches using sed on macOS [closed] 【发布时间】:2021-11-13 13:44:37 【问题描述】:

如何使用 sed 在文件中的两个连续匹配后插入文本。这可能吗?如果是,我该怎么做?

我的文件:

abcdef()K
.xyz 1
('I want to add text here')

请注意,.xyz 将是相同的,但它可以是 1 或 2 或 3 或任何其他数字。但是 .xyz 肯定会在 abcdef()K 之下。我想在 .xyz 部分之后添加文本。

请帮助大家。谢谢。

【问题讨论】:

perl -0777 -pE 's/^(abcdef\(\)\R\.xyz.*\R?)/\1(your text here)\n/mg' file 【参考方案1】:

你可以使用这个 perl:

perl -0777 -pE 's/^(abcdef\(\)K\R\.xyz.*\R?)/\1(your text here)\n/mg' file

或者这个 awk:

awk -v ins="(your text)" '/abcdef()K/f=1; print; next
f && /\.xyz.*/f=0; print; print ins; next
f=0; print' file

【讨论】:

【参考方案2】:

如果.xyz [0-9] 是常量并且始终位于第一个匹配项的下一行,那么您可以在新行后面附加sed

$ sed '/\.xyz [0-9]*/a New Text' input_file
abcdef()K
.xyz 1
New Text

否则,你可以匹配第一行,如果第一行匹配,则添加一个条件替换第二行的匹配,替换它自己,跳转到新行并附加新文本。

sed '/a.*()K/ N;s/\.xyz [0-9]*/&\nNew Text/' input_file
abcdef()K
.xyz 1
New Text

【讨论】:

我可以在 mac 上执行此操作吗? mac 上的 sed 要求您添加 a\ 并在下一行添加文本。这仅找到 .xyz 先生的匹配项。我也想匹配 abcdef()K。 @Mtoklitz113 我们追加的第一个命令应该可以工作。第二个可能不是换行的原因,可以试试sed '/a.*()K/ N;s/\.xyz [0-9]*/&'$'\nNew Text/'或者sed '/a.*()K/ N;s/\.xyz [0-9]*/&\\\nNew Text/' 我在使用第二个选项时出现“替代命令中的错误标志”错误。 @Mtoklitz113 我的命令在 GNU sed 上进行了测试,我无法复制您的错误标志问题。你的 Mac 上安装了 gsed 吗?【参考方案3】:

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

sed -e '/abcdef()K/!b' -e ':a;n;/\.xyz/!ba' -e 'a new text added' file

如果一行不包含abcdef()K bail out。

打印当前行并获取下一行。

如果当前行不包含.xyz,重复上述操作。

否则,将new text added 附加到当前行。


sed -e '/abcdef()K/!b' -e ':a' -e 'n' -e '/\.xyz/!ba' -e 'a new text added' file

或者:

cat <<\! | sed -f - file
/abcdef()K/!b
:a
n
/\.xyz/!ba
a new text added
!

【讨论】:

我用的是 mac 先生。它可以在 Mac 上运行吗? @Mtoklitz113 我相信是这样,但您可能需要再分两个步骤,请参阅编辑。 我收到错误 sed: -e: No such file or directory 先生。我该怎么办? @Mtoklitz113 您可以将命令放在文件中或使用第二种选择。 potong 的 sed 需要 GNU sed。 Mac 只安装了 bsd sed。您可以使用 brew 或 macports 安装 GNU sed。

以上是关于需要帮助在 macOS 上使用 sed 在两次连续匹配后插入文本 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

linux六周第二次课(3月13日)笔记

学习笔记第二十六节课

sed 在 MacOS 上的“未定义标签”

如何仅列出在两次提交之间更改的文件的名称

为啥在两次调用 promise 时 RSVP Deferred 会产生错误

使用sed修剪stdout的开头