Replace sed替换上一行字符串匹配后第一次出现的字符串
我有一个问题,我真的希望找到答案。Replace sed替换上一行字符串匹配后第一次出现的字符串,replace,sed,line,match,Replace,Sed,Line,Match,我有一个问题,我真的希望找到答案。 这是一个有几行相同的文件,但我只想替换匹配后出现的第一行 我想在[blabla]行之后将第一个Iam2更改为Iwas2 file.txt: Iam Iam1 Iam2 Iam21 [blabla] Iam3 Iam2 Iam3 Iam2 我试过: $ cat file.txt | sed '1,/[blabla]/a \' | sed '0,/Iam2/s//Iwas2/' 而且 $ cat file.txt | s
这是一个有几行相同的文件,但我只想替换匹配后出现的第一行 我想在[blabla]行之后将第一个Iam2更改为Iwas2 file.txt:
Iam
Iam1
Iam2
Iam21
[blabla]
Iam3
Iam2
Iam3
Iam2
我试过:
$ cat file.txt | sed '1,/[blabla]/a \' | sed '0,/Iam2/s//Iwas2/'
而且
$ cat file.txt | sed '/[blabla]/a \' | sed '0,/Iam2/s//Iwas3/'
我做错了什么?单向假设
用问题的数据填充:
sed -e '
## From "[blabla]" until last line try to substitute "Iam2". If the
## substitution succeeds go to label "a".
/\[blabla\]/,$ {
s/Iam\(2\)/Iwas\1/;
ta
}
## The substitution didn't succeed, so begin next cycle.
b
## Label "a".
:a
## Substitution succeed, so I don't want to repeat previous process. Now
## read each line and print it without modification until end of file.
N;
P;
s/^[^\n]*\n//;
ba
' infile
这将产生:
Iam
Iam1
Iam2
Iam21
[blabla]
Iam3
Iwas2
Iam3
Iam2
这可能适用于您(GNU-sed):
很好的解决方案。我没有想过要用awk。请你解释一下这个命令,它在做什么。我知道这是可行的,但怎么办?一旦遇到模式“blabla”,只需将标志变量“f”设置为1。当遇到模式“Iam2”时,将其更改为“Iwas2”并重置标志。由于标志已重置,因此不会再出现“Iam2”。您好,感谢您的快速响应。
我尝试了突击队,但出现错误:
[user@machine]$sed-e'/[blabla]/,${s/Iam(2)/Iwas\1/;ta}b:a N;Ps/^[^\n]*\n/;ba'file.txt sed:-e expression#1,char 42:commands后面的额外字符您是否将其作为一行程序运行?在这种情况下,必须使用分隔指令代码>。
awk 'f==1 && /Iam2/{$0="Iwas2";f=0}/blabla/{f=1}1' file
sed '/\[blabla\]/,/Iam2/!b;/Iam2/!b;s//Iwas2/;:a;n;$!ba' file