2011-10-19 20 views
3

シェルスクリプトを使用して複数の行を検索して置き換える方法を探しています。これは私がやろうとしていることです:シェルスクリプト:複数の行を検索して置き換える

source: 
[stuff before] 
<!--WIERD_SPECIAL_COMMENT_BEGIN--> 
    [stuff here, possibly multiple lines. 
<!--WIERD_SPECIAL_COMMENT_END--> 
[stuff after]  

target: 
[stuff before] 
[new content] 
[stuff after] 

要するに、コメントとそれらの間のすべてを削除して新しいコンテンツに置き換えたいと思います。基本的に、私は複数の行にわたって単純なsedコマンドを実行したいと考えています。可能であれば、いくつかの基本的な* nixツールを使用して、追加のスクリプト言語は使用しません。

+0

ネストされたコメントはどうですか? – FailedDev

答えて

1

完全な行にのみ一致する必要がある場合は、 awkでこのタスクを実行できます。以下のような何か:ファイルがとてもよく にコメントして、あなたが保持するか削除するテキストと同じ行、その後、私は 、perlを使用する単一の文字列にファイル全体を読んでいましたがフォーマットされていない場合

awk -v NEWTEXT=foo 'BEGIN{n=0} /COMMENT_BEGIN/ {n=1} {if (n==0) {print $0}} /COMMENT_END/ {print NEWTEXT; n=0}' < myfile.txt 

、 正規表現をマッチしてその文字列を置換し、新しい文字列を新しいファイル に書き込みます。これはあまり簡単ではないので、作業を行うにはperlスクリプトを書く必要があります。以下のような 何か:

#!/usr/bin/perl 
$newtext = "foo\nbar"; 
$/ = ''; # no input separator so whole file is read. 
$s = <>; # read whole file from stdin 
$startPattern = quotemeta('<!--WIERD_SPECIAL_COMMENT_BEGIN-->'); 
$endPattern = quotemeta('<!--WIERD_SPECIAL_COMMENT_END-->'); 
$pattern = $startPattern . '.+' . $endPattern; 
$s =~ s/$pattern/$newtext/sg; 
print $s; 
+0

私のファイルはかなりストレートですので、そのトリックを行う必要があります。好奇心から、もし私がラインで行くことができなかったら私のためにそれを行うことができる基本的なunixツールはありますか、私はもっと強力なものが必要ですか? – Reason

+0

これは 'sed'やその他の基本的なUNIXツールにとっては難しいと思います。私は 'perl'に例を追加しました。これは、行単位で作業していないときの最も簡単な解決策だと思います。 –

0

sedが、これはうまくありません。以下は、それが得られるほど簡単です。開始デリミタの前、または終了デリミタの後にデリミタ行から要素を抽出する必要がある場合は、もう少し複雑になるでしょう。

sed '/<!--WIERD_SPECIAL_COMMENT_BEGIN-->/,/<!--WIERD_SPECIAL_COMMENT_END-->/d' input >output 

これを支配している場合は、「奇妙な」のスペルを修正してください。

0

別の解決策...これはワンライナーで行うことが可能であるが、私はよりで動作するように簡単に見つけるPerlを使用して正規表現は、またはawkのをセッド(マルチと厄介ですラインマッチと置換):

perl -0 -i -pe 's/<!--WIERD_SPECIAL_COMMENT_BEGIN-->[\s\S]*<!--WIERD_SPECIAL_COMMENT_END-->/your new content here/gim' yourfile1.txt 

これは、ファイルを新しい変更されたコンテンツで置き換えることに注意してください。

関連する問題