sed匹配包含特殊字符的多行,并替换匹配模式的一部分

时间:2018-08-28 06:18:24

标签: bash shell sed

将以下几行视为文本文件:

START This is a 
sample paragraph that has special characters like new lines

spaces, tabs, quotes "abc", equals =, angular brackets <abc>, front slash / and might contain the starting string that should be ignored
START and 

END

START

dfgfah

END

使用sed,我只想在第一次出现的START和第一次出现的END之间替换文本。

我期望的结果是:

START new_text END

START

dfgfah

END

我尝试过的是:

sed ':a;N;$!ba;s/START.*END/START New text END/' sample.txt>sample_2.txt

但是结果是:

START New text End

在第一次出现END之前如何替换?

2 个答案:

答案 0 :(得分:1)

使用GNU sed:

*/1 * * * *    sleep 5; mycommand 
^^                ^^
every minute   five seconds
  • sed '0,/START/{:a;/END/!{N;ba};s/.*/START new_text END/;}' file :从0,/START/的第一次出现起
  • START:将新行添加到模式空间,直到找到:a;/END/!{N;ba}
  • 当上述循环结束时,将合并的行替换为END

答案 1 :(得分:0)

您可以使用os来定义标签,并使用import os url = os.environ['HTTP_HOST'] uri = os.environ['REQUEST_URI'] return url+uri 来分支到:脚本中的标签。

选项b告诉sed自动不打印任何行。相反,您可以使用-n命令来打印行。

在下面的示例中,sed循环循环直到第一个p的部分,而:head循环循环在第一个START之后的文本。 :tail循环在第一个END:start之间的部分循环。

STARTEND循环每行(:head)打印(:tail),并在到达文件末尾(p时退出)。 n循环不会打印,只会忽略内容。找到$q后,将插入新文本(:start)并打印(END)。

s

以上技术摘自The Geek Stuff's sed tutorial的第一个示例。