2009-08-09 14 views
1

"begin"と "end"の単語の間に "before"がある "before"という単語を "before"という単語に置き換えるには、次のようなコマンドを使用できます。単語のペアから単語

のsed '/開始/、/終了/ {S /前/後/グラム}'

私は彼らが行う場合にのみ、 "後" による "の前に" 置換する方法を探していますではなく、が「開始」と「終了」のペアの内側で発生します。

答えて

1

反転がほとんど自明です:

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 'は置換をオフにしません。 (そして、あなたが使用している場合は「終了前に」後「の前に」まだ「の後」で置換され、「開始」。)

+0

よりも適切であるため、アドレス範囲の始めには超音速の 's'があります。 –

+0

@William - あなたは大丈夫です。固定して、ありがとう! –

0

そのジョブの正しいツールは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 
+0

-1 sedのバージョンは完全に些細な、とawkの –

0
awk '/begin/{f=1}/end/{f=0}!f{ gsub("before","after")}1' file 
関連する問題