我有以下文字:
A
Hello
world
B
Hello
world
C
Hello
world
我知道我可以Hello
使用以下Hi
方法替换sed
:
sed 's/Hello/Hi/g' -i test
但这将每个替换Hello
为Hi
:
A
Hi
world
B
Hi
world
C
Hi
world
我真正想要的是仅替换Hello
之后的内容B
:
A
Hello
world
B
Hi
world
C
Hello
world
所以我尝试过这个:
sed 's/"B\nHello"/"B\nHi"/g' -i test
但什么也没发生,我该怎么办?
注意:文件的每一行的开头都有一些空格。
答案1
就像是:
sed '/^[[:blank:]]*B$/{n;s/Hello/Hi/g;}'
假设没有连续的B
s(一行B
后面跟着另一B
行)。
否则,你可以这样做:
awk 'last ~ /^[[:blank:]]*B$/ {gsub("Hello", "Hi")}; {print; last=$0}'
等价的sed
是:
sed 'x;/^[[:blank:]]*B$/{
g;s/Hello/Hi/;b
}
g'
要替换后面的第二个单词,或者仅当上面两行包含以下内容时才B
替换world
为:universe
B
awk 'l2 ~ /B/ {gsub("world","universe")}; {print; l2=l1; l1=$0}'
将其概括为n
上面的行:
awk -v n=12 'l[NR%n] ~ /B/ {gsub("foo", "bar")}; {print; l[NR%n]=$0}'
答案2
您可以添加命令来查找 B 前后的白色
假设 u1 是
A
Hello
world
B
Hello
world
C
Hello
world
B (<-tailing whites)
Hello
world
使用命令
sed '/^[ ]*B[ ]*$/{n;s/Hello/Hi/;}' u1
A
Hello
world
B
Hi
world
C
Hello
world
B
Hi
world
答案3
当您有两个连续的情况时,这sed
可以处理这种情况B
:
$ sed ':a
/B$/{$!N;/\n[[:blank:]]*Hello$/!ba;s/Hello/Hi/}
' file