次のテキストがあります。
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}'
答え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
これは、2つの連続した状況がある場合にsed
状況を処理しますB
。
$ sed ':a
/B$/{$!N;/\n[[:blank:]]*Hello$/!ba;s/Hello/Hi/}
' file