次のテキストがあります。
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行に次のものが含まれている場合にのみ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}'