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

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

1つの複数行文字列を別の複数行文字列に置き換えることで、更新したいファイルがたくさんあります。おおよそ次のようになります。

* Some text, 
* something else
* another thing

私はそれを次に変更したいと思います:

* This is completely
* different text

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

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

見つけることができるショートカットがありますか? Sedはオプションなのに\nなどを追加しなければならないのでぎこちないですね。 「このファイルから入力を受け取り、このファイルと一致させ、他のファイルの内容に置き換えてください」と言う方法はありますか?必要に応じてPythonを使用できますが、高速で簡単なものが必要なので、利用可能なユーティリティがある場合は、スクリプトを直接作成する(方法を知っています)を作成するよりもPythonを使用する方がよいでしょう。

答え1

1 つ以上の入力ファイルで、「Some...\n...Thing」を「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/...

答え2

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行の投稿で構成されています。

答え3

しかし、ripgrep 特にインライン置換はサポートされていません。--replace、現在の機能はこのユースケースに既に役立つと思います。

rg --replace "$(cat new.txt)" --passthru --no-line-number \
--multiline --multiline-dotall 'Some.*?thing\n' multi.txt > output.txt
  • --replace 'string'代替モードを有効にし、代替文字列を設定します。などを使用してキャプチャされた$1正規表現グループを含めることもできます。
  • $(cat new.txt)ファイルの内容をnew.txt代替文字列として渡します。
  • --passthruripgrep通常、正規表現パターンに一致する行のみが表示されるため、これは必須です。このオプションを使用すると、ファイル内の一致しない行も表示されます。
  • --no-line-number / -Nデフォルトでは、行番号が出力に含まれるためですripgrep(一致する行のみを表示する場合に便利です)。
  • --multiline / -U複数行処理を有効にし、デフォルトで無効になっています。
  • --multiline-dotallドット('.')正規表現パターンが改行文字(\n)と一致するようにしたい場合にのみ必要です。
  • > output.txtインライン置換はサポートされていないため必須です。--passthroughおよびオプションを使用すると、no-line-number標準出力を必要とする新しいファイルを代替ファイルと一致させ、通常どおりに保存できます。

ただし、このコマンドは各ファイルに対して個別に実行する必要があるため、複数のファイルを操作する場合は便利ではありません。

答え4

あまり強力ではなく(2番目の文字列をチェックしませんが解決しやすいので)、posixと互換性がないかもしれませんが、非常に簡単です。

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

最初のコマンドは次の行を追加します。一部のテキスト私たちが会うまでもう一つその後、2行目はそれを別のテキストに変更します。

ノート制限は一部のテキスト常に従わなければならないもう一つ

関連情報