sed 在两种模式之间搜索并仅在搜索结果末尾附加文本

sed to search between two patterns and append text at the end of search result only

这是我的文件 (test.txt):

start
line1
line2
line3
end

我想搜索模式 startend 之间的所有行,然后在搜索到的末尾附加“<”线。最终输出应该是(需要在同一文件中进行内联替换):

start
line1<
line2<
line3<
end

我还想在同一文件中进行内联替换。这是我到目前为止所做的。

sed -n '/start/,/end/{/start/!{/end/!p;};}' test.txt 

这给了我以下输出:

line1
line2
line3

但我不知道如何在同一行中进行内联替换。我试过了,但没用。

sed -n -i.bkp '/start/,/end/{/start/!{/end/!p;};}; s/$/</' test.txt

您可以使用

sed -i.bkp '/start/{:a;N;/end/!s/$/</;/end/!ba;}' test.txt

详情:

  • /start/ - 匹配包含 start 的行,然后执行后续的命令块...
    • :a - 设置一个 a 标签
    • N - 读取下一行并将其附加到模式 space
    • /end/! - 如果当前模式中没有 end space...
    • s/$/</ - 用 < 替换字符串位置的结尾(在模式 space 的末尾添加 <
    • /end/!ba - 如果有 end 停止处理块,否则,转到 a 标签。

参见 online demo:

#!/bin/bash
s='start
line1
line2
line3
end'
sed '/start/{:a;N;/end/!s/$/</;/end/!ba;}' <<< "$s"

输出:

start
line1<
line2<
line3<
end

这可能适合您 (GNU sed):

sed -i '/start/,/end/{//b;s/$/</}' file

Select startend 之间的范围,如果它不是表示范围的两个正则表达式中的任何一个,则将 < 附加到每行的末尾。