需要帮助在 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\ 并在下一行添加文本。这仅找到 .xyzsed '/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 在两次连续匹配后插入文本 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章