
1000個のソースファイルがあり、正規表現に一致するすべてのテキストを見つけて、各一致を結果テキストファイルの対応する行に出力しようとしています。
例えば。
// a.cs
string test = _.Text("Hello World!") + _.Text("Foo");
// b.cs
Debug.Log(_.ActionText("Bar"));
// results.txt
_.Text("Hello World")
_.Text("Foo")
_.ActionText("Bar")
どのコマンドがこれを達成しますか?例を挙げることができますか?
答え1
sed '/\n/P;//!s/_\.[^ ("]*Text([^)]*)/\n&\n/;D' files... >results.txt
...操作することもできます。これを実行すると、サンプルデータが印刷されます。
_.Text("Hello World!")
_.Text("Foo")
_.ActionText("Bar")
それがすることは、行の最初の項目を行に\n
まとめることだけです。成功したかどうかにかかわらず、パターンスペースの最初の行をD
削除します\n
。一致しない行の場合は出力から完全に削除されますが、一致する行の場合はパターンの先頭のみが削除され、スクリプトは一番上で再起動されます。 ewlineがパターンスペースで一致する場合\n
(一致項目を見つけて削除した場合にのみ発生します)、パターンD
スペース(一致した文字列の末尾)に最初に表示されるewlineのみがsed
印刷されます。\n
ewlineがパターンスペースにすでに存在する場合、置換はs///
試行されないため、eleteコマンドは印刷された一致を消去し、最後の一致が終了するとループが再開されます。!
\n
D
ただし、状況によっては、正しい代替フィールドの代わりにsed
リテラルewlineを使用する必要があります。ただし、すべてのファイルパラメータを一度に実行するか、少なくとも1つのパラメータを一度に実行できる必要があります。\n
n
(ARGMAXの制限によって異なります)。 Shell globを使用してこれを取得できます。または...
find /path -name pattern -exec sed script_above {} + >>results.txt
...sed
すべての入力ファイルが単一のストリームとして扱われるからです。
答え2
グレブを使用できます。
grep -Eo '_\.\w+\("[^"]+"\)'