sed 在两种模式之间搜索并仅在搜索结果末尾附加文本
sed to search between two patterns and append text at the end of search result only
这是我的文件 (test.txt):
start
line1
line2
line3
end
我想搜索模式 start 和 end 之间的所有行,然后在搜索到的末尾附加“<”线。最终输出应该是(需要在同一文件中进行内联替换):
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 start
和 end
之间的范围,如果它不是表示范围的两个正则表达式中的任何一个,则将 <
附加到每行的末尾。
这是我的文件 (test.txt):
start
line1
line2
line3
end
我想搜索模式 start 和 end 之间的所有行,然后在搜索到的末尾附加“<”线。最终输出应该是(需要在同一文件中进行内联替换):
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 start
和 end
之间的范围,如果它不是表示范围的两个正则表达式中的任何一个,则将 <
附加到每行的末尾。