Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux sed:在两行上查找模式,而不是在该模式之后替换_Linux_Sed - Fatal编程技术网

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:)了。