ファイル内の複数行の文字列を置換


17

ある複数行の文字列を別の複数行の文字列で置き換えることにより、更新したいファイルがいくつかあります。以下の線に沿ったもの:

* Some text, 
* something else
* another thing

そして、私はそれを次のものに置き換えたいです:

* This is completely
* different text

結果は、置換後、テキストの最初のブロックを含むファイルに2番目の文字列が含まれるようになります(ファイルの残りの部分は変更されません)。

問題の一部は、ファイルシステムで更新するファイルのリストを見つける必要があることです。私はそのためにgrepを使用することができます(複数行の文字列を使用するのは簡単ではありませんが)sedでパイプすることができますか?

これを行う簡単な方法はありますか?Sedはオプションですが、\ nなどを追加する必要があるため厄介です。「このファイルから入力を取得し、それらのファイルで一致させてから、この他のファイルのコンテンツで置き換える」と言う方法はありますか?必要に応じてpythonを使用できますが、すばやく簡単なものが必要なので、利用可能なユーティリティがある場合は、独自のスクリプト(方法を知っています)を作成するよりもむしろそれを使用します。


これにはおそらくperlを使用する必要があります。 stackoverflow.com/questions/1030787/…–
オリオン

3
それで、some text, something else another thing複数行にわたるかどうかを一致させたいですか?それとも、一致させたいだけですsome text,\nsomething else\nanotherthingか?
mikeserv

2
質問を編集して、各ファイルの内容と正確な内容、および目的の出力を明確にします。
-jimmij

文字列は複数行にまたがっています。一致/置換の際に空白は絶対に同じではない可能性があるため、むしろ無視しますが、1-1の一致(改行とすべて)を行うだけでも大した問題ではありません。
ventsyv

回答:


12

1つまたは複数の入力ファイルのファイル「new」の内容を「Some ... \ n ... Thing」に置き換えます

perl -i -p0e 's/Some.*?thing\n/`cat new`/se' input.txt ...
  1. -i input.txtを直接変更するには
  2. -p0 入力ファイルfileを丸lurみし、最後に印刷します
  3. s/regexp/.../s 正規表現で..|\n
  4. s/.../exp/e に置き換える eval(exp)
  5. 新規-置換テキストを含むファイル(これは完全に...異なるテキストです)
  6. 有用であれば、元のテキストを展開できます s/Some text\n...\n...thing\n/...

「前」と呼ばれるファイルで同じことを実行して、そのファイルの(複数行)コンテンツを検索するにはどうすればよいですか?試しましたが、うまくいきません。
Kvothe

@Kvothe、我々は特別な文字を持たない「前に」、あなたは試みることができると仮定すると詳細が必要perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
JJoao

また、「前」には、 'と `を除くすべての特殊文字(改行、スラッシュ、角括弧)が含まれると仮定します。
Kvothe

5
sed -e :n -e '$!N;/\n.*\n/!{$!bn
};  s/some text,\n* *something else\n* *another thing/this is completely\
different text/;P;D' <infile

問題の具体的な説明を打ち出すまで、あなたに合った解決策を見つけるのに苦労するのではないかと心配しています。しかし、それはQAが最も適していることです。たぶん、これはあなたにアイデアを与えるでしょう-一度に1行だけ入力ファイルを前方にスライドしながら、常に3行をパターンスペースに保持します-2行先読みします。

複数行にわたるかどうかに関係なく、文字列と一致できる必要があります。つまり、最大3つです。しかし、代替品にそのプロビジョニングをミラーリングするためのプロビジョニングはありません-書かれているように常に2行にまたがっています。


0

強くない(2番目の文字列をチェックしないで解決するのが簡単だから)であり、posixに準拠していないが、非常に単純である可能性がある:

sed '/^Some text/{:1;/another thing$/!{N;b 1}
     s/.*/this is completely\ndifferent text/g}' input.txt

最初のコマンドは、いくつかのテキストから行を追加し、別のものに出会った後、2行目でそれを他のテキストに変更します。

制限は、いくつかのテキストがいつも別のものによって続かれるべきであるということです。


問題は、文字列が2行(最大で12行程度)で、タブなどのエスケープが必要な他のものが含まれている可能性があることです。*など。
ventsyv15年

@ventsyv行またはセパレータの数に問題はありません-スクリプトは開始と終了のみをチェックします。開始文字列が例外的に変更するテキストをマークできれば、それで十分です。正しいパターンを生成するための入力例を示した方が良い場合はありません。
コスタ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.