web-dev-qa-db-ja.com

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

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

* Some text, 
* something else
* another thing

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

* This is completely
* different text

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

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

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

18
ventsyv

"Some ...\n ... Thing"を1つ以上の入力ファイルの "new"ファイルの内容に置き換えます

_Perl -i -p0e 's/Some.*?thing\n/`cat new`/se' input.txt ...
_
  1. _-i_ input.txtを直接変更する
  2. _-p0_入力ファイルファイルを丸呑みして、最後に印刷する
  3. 正規表現の_s/regexp/.../s_ _._は_.|\n_
  4. _s/.../exp/e_ eval(exp)で置き換えます
  5. new-置換テキストを含むファイル(これは完全に...別のテキストです)
  6. 役立つ場合は、元のテキストを拡張できます_s/Some text\n...\n...thing\n/..._
12
JJoao
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に最適です。多分これはあなたにアイデアを与えるでしょう-それは常に一度に3行をパターンスペースに保ちます-2行先読みで-入力ファイルを一度に1行だけ前方にスライドさせます。

文字列が複数行にまたがるかどうかに関係なく、最大3行まで一致する必要があります。しかし、置換でその規定をミラーリングする規定はありません-記述されているように、常に2行にまたがっています。

5
mikeserv

別のsedアプローチ。

sed '1s/* Some text, 
* something else
* another thing/* This is completely
* different text/' infile.txt 
1
αғsнιη

強くない(2番目の文字列をチェックしないので簡単に解決できるため)およびposixコンパイラではなく、非常に単純である可能性があります。

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

最初のコマンドはSome textから別のテキストまで、次に2番目のテキストを追加します。行を他のテキストに変更します。

[〜#〜] note [〜#〜]制限は、一部のテキストの後には必ず別のもの

0
Costas