2011-11-17 15 views
8

のsedで複数のラインパターンを交換します。このため、私は試しましたは</p> <p>は、inputfileの</p> <pre><code>SOMETHING {}; </code></pre> <p>によって</p> <pre><code>EXTRATHING { }; </code></pre> <p>を置き換える私は単純に次の操作を行いたい

sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt >outfile.txt 

これは動作しません。誰かがsedでこれを行う正しい方法であると示唆することはできますか?

答えて

5
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt 

となります。

この問題は、入力文字列全体がsedのバッファに格納されていることが原因です。

詳細情報とより効率的なバージョンについては、sed and Multi-Line Search and Replaceを参照してください。

sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt 

をしたり、元のファイルを編集したい場合:

0

これはあなたのために働くかもしれない

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file 

EDIT:

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' 
> aaa 
> EXTRATHING { 
> }; 
> bbb 
> EXTRATHING { 
> }; 
> ccc 
> ! 
aaa 
SOMETHING{} 
bbb 
SOMETHING{} 
ccc 

編集:ここで要求されるようにする例を示します:最初のアドレスと最後のアドレスが連続する行である場合は、次のようにします。

# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}' 
> aaa 
> EXTRATHING { 
> bbb 
> }; 
> ccc 
> EXTRATHING { 
> }; 
> ddd 
> ! 
aaa 
EXTRATHING { 
bbb 
}; 
ccc 
SOMETHING{} 
ddd 

別の方法(おそらく簡単に?):

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D' 
SOMETHING {}; 
+0

あなたの例を掲載するように気をつけてください;-)?私はちょうど返された元の文書を得る..幸運。 – shellter

+0

ありがとう@potong。ただし、 "EXTRATHING {"と "};"の間に他の行がある場合は、元のパターンも削除されます。私はそれらを置き換えることを望んでいません。したがって、次のものは "EXTRATHING {\ n something \ n};"に置き換えるべきではありません。 " – bbv

+0

ありがとうございます、あなたのコードはsed 4 *で動作しますが、私がUWINで持っているun-versionedバージョンでは動作しません。範囲式を使用して2行をキャプチャしていますか?すなわち '/ x /、/ y /'?皆さんお元気で。 – shellter

3

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

+4

これを説明できますか?ありがとう。 :) – Ray

+1

質問の悪い理解に基づいていたと思います。 – BCS

3
sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt 
1
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file 

は、以下のテスト:

> cat temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
EXTRATHING { 
}; 
ghekg 
jhgjk 
wefjkwngk 
EXTRATHING { 
    }; 
jbgvjnrg 
jbfw 
wefnkwk 
EXTRATHING { 
}; 
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp 
fjbwjfbw 
wefjkbwjk 
jbefwejr 
SOMETHING{}; 
ghekg 
jhgjk 
wefjkwngk 
SOMETHING{}; 
jbgvjnrg 
jbfw 
wefnkwk 
SOMETHING{}; 
> 

ファイルをインラインで変更したい場合。 -iフラグを追加します。以下のような :

perl -i -lne '.......' your_file 
0

のsedでそれを行うために、その困難は、サブスクリプトを書く必要があります。 ただし、Perlを使用してワンライナーを使用することができます。

-0777は、そのいずれかを言う-e画面 上のすべてのファイルおよびプリントするためのコマンドを実行します-p、レコード区切り(テキストファイル内の終了行) ある
perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt 

行コマンド

関連する問題