sedを使用して重要な行とスペースの後ろの単語を変更しますか(インライン)?

sedを使用して重要な行とスペースの後ろの単語を変更しますか(インライン)?

次のテキストがあります。

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

連続したsがないと仮定しますB(あるB行の後に別の行が来ますB)。

それ以外の場合は、次のようにできます。

awk 'last ~ /^[[:blank:]]*B$/ {gsub("Hello", "Hi")}; {print; last=$0}'

これに対応するsedものは次のとおりです。

sed 'x;/^[[:blank:]]*B$/{
       g;s/Hello/Hi/;b
     }
     g'

B後ろの2番目の単語を置き換える場合、または上記の2行に次のものが含まれている場合にのみworlduniverseB

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

おすすめ記事