"begin"と "end"の単語の間に "before"がある "before"という単語を "before"という単語に置き換えるには、次のようなコマンドを使用できます。単語のペアから単語
のsed '/開始/、/終了/ {S /前/後/グラム}'
私は彼らが行う場合にのみ、 "後" による "の前に" 置換する方法を探していますではなく、が「開始」と「終了」のペアの内側で発生します。
"begin"と "end"の単語の間に "before"がある "before"という単語を "before"という単語に置き換えるには、次のようなコマンドを使用できます。単語のペアから単語
のsed '/開始/、/終了/ {S /前/後/グラム}'
私は彼らが行う場合にのみ、 "後" による "の前に" 置換する方法を探していますではなく、が「開始」と「終了」のペアの内側で発生します。
反転がほとんど自明です:
sed '/begin/,/end/ !s/before/after/g'
は、以下の入力
begin before end
before
end
before
begin
before end
before
end
before
与えられたあなたのオリジナルのスクリプトは、出力を与えることに注意してください:
begin after end
after
end
before
begin
after end
before
end
before
注「末端こと'と同じ行の' begin 'は置換をオフにしません。 (そして、あなたが使用している場合は「終了前に」後「の前に」まだ「の後」で置換され、「開始」。)
そのジョブの正しいツールはsed
ではなくawk
です。あなたの現在のsed
と同じことを行うには:
echo 'before
begin
before
end
before' | awk '
BEGIN {st=0;}
/begin/ {st=1;}
/end/ {st=0;}
{
if (st==1) {
gsub("before","after");
print;
} else {
print
}
}'
はあなたを与えるだろう:あなたはgsub
を制御if
文の意味を逆にした場合
before
begin
after
end
before
は、あなたが望む結果を得るでしょう:
echo 'before
begin
before
end
before' | awk '
BEGIN {st=0;}
/begin/ {st=1;}
/end/ {st=0;}
{
if (st==0) {
gsub("before","after");
print;
} else {
print
}
}'
あなたを与えるだろう。
after
begin
before
end
after
-1 sedのバージョンは完全に些細な、とawkの –
awk '/begin/{f=1}/end/{f=0}!f{ gsub("before","after")}1' file
よりも適切であるため、アドレス範囲の始めには超音速の 's'があります。 –
@William - あなたは大丈夫です。固定して、ありがとう! –