【问题标题】:Need help inserting text AFTER two consecutive matches using sed on macOS [closed]需要帮助在 macOS 上使用 sed 在两次连续匹配后插入文本 [关闭]
【发布时间】: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

标签: macos sed zsh


【解决方案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。
    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2012-07-12
    • 2015-01-12
    相关资源
    最近更新 更多