Linux sed:在两行上查找模式,而不是在该模式之后替换
哇,这个真的让我着迷。我想这里需要一些技巧。以下是我尝试替换的命令文本的输出值:Linux sed:在两行上查找模式,而不是在该模式之后替换,linux,sed,Linux,Sed,哇,这个真的让我着迷。我想这里需要一些技巧。以下是我尝试替换的命令文本的输出值: ... fast n : abstaining from food 我想用以下值替换它: ... Noun : abstaining from food 我认为这是个骗局。因为“fast”被列出了很多次,而且它在行的开头的其他地方也被列出了。所以我提出了这个定义范围: sed '/fast/,/^ n : / s/fast/Noun/' 我以为可以,但是。。。不幸的是,这并没有结束替换,匹
...
fast
n : abstaining from food
我想用以下值替换它:
...
Noun
: abstaining from food
我认为这是个骗局。因为“fast”被列出了很多次,而且它在行的开头的其他地方也被列出了。所以我提出了这个定义范围:
sed '/fast/,/^ n : / s/fast/Noun/'
我以为可以,但是。。。不幸的是,这并没有结束替换,匹配后的其余输出将替换为名词。如何让sed在赛后停止更换?更好的是,我可以找到一个两行模式匹配并替换它吗?这似乎可以满足您的要求:
sed -e ':a;N;$!ba;s/fast\n n/Noun\n/'
我基本上是从别人那里偷来了答案。试试这个:
sed "h; :b; \$b ; N; /^${1}\n n/ {h;x;s//Noun\n/; bb}; \$b ; P; D"
不幸的是,Paul的回答读取了整个文件,这使得您可能想要执行的任何附加处理都很困难。这个版本成对地阅读这些行
通过将sed
脚本用双引号而不是单引号括起来,可以包含shell变量,例如位置参数。我建议在它们周围加上大括号,这样它们就可以与相邻的角色分开。当使用双引号时,您必须小心shell想要进行各种扩展。在本例中,我对表示branch命令输入文件最后一行的美元符号进行了转义。否则,shell将尝试替换可能为null的变量$b
的值,从而使sed
不满意
另一种方法是使用单引号,并在每次使用shell变量时关闭和打开它们:
sed 'h; :b; $b ; N; /^'${1}'\n n/ {h;x;s//Noun\n/; bb}; $b ; P; D'
# ↑open close↑ ↑open close↑
我假设预期结果中的“[/code]”是一个输入错误。如果不是,请告诉我。这可能适合您:
sed '$!N;s/^fast\n\s*n :/Noun\n :/;P;D' file
...
Noun
: abstaining from food
我现在知道的比我知道的多一点:)(仍然要学习寄存器),但是工作得很好。不幸的是,这不允许使用变量:sed-e':a;N、 美元!文学士;s/$1\n/名词\n/'对此有何想法?您是指搜索部分中的$1还是替换部分中的$1?我不确定当你把它放在搜索部分时会发生什么。是的,这是搜索部分。显然,由于某种原因,变量在放在那里时没有被正确读取。这不仅是一个很好的命令,而且是一个很好的答案描述良好,命名不含糊。我只通读了一遍,明白了它的意思。谢谢你,丹尼斯!哦,很好地抓住了打字错误抱歉,我不能投票,因为我没有声誉。当我有多行模式匹配和/或替换时,我使用
awk
或perl
而不是sed
。这是因为我不是sed
的专家,对我来说,其他工具在此类问题上更为合作。是的,我想我可能不得不走这条路。尽我所能得到一个变量。。。看起来,是时候开始学习awk/perl:)了。