使用 sed 替换重要行和空格(内联)后的单词?

使用 sed 替换重要行和空格(内联)后的单词?

我有以下文字:

  A
  Hello
  world
  B
  Hello
  world
  C
  Hello
  world

我知道我可以Hello使用以下Hi方法替换sed

sed 's/Hello/Hi/g' -i test

但这将每个替换HelloHi

  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;}'

假设没有连续的Bs(一行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为:universeB

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

相关内容