次の問題を解決するのに役立ちます。\
n
すべてのファイルの Test_Macro からすべての文字ペアを削除します。次の例をご覧ください。
1.txtと入力してください。
Test_Macro(abc, def, "\n string1 string2 \n test string",
"test string2 \n");
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...
ディレクトリ1/ファイル2.txt
Test_Macro(abc, def, "\n string1 string2 \n test string",
"test string2 \n",
123456);
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...
予想される結果:
ファイル1.txt
Test_Macro(abc, def, " string1 string2 test string",
"test string2 ");
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...
ディレクトリ1/ファイル2.txt
Test_Macro(abc, def, " string1 string2 test string",
"test string2 ",
123456);
// Some code or text
Test_Macro(asdsadas, "test String1");
// Some code...
どんな助けやアドバイスにも感謝します。私はいくつかのスクリプトを書くつもりです。さまざまな種類のファイルとそのようなマクロが多いからです。よろしくお願いします!
Test_Macroの引数は、他のマクロへのネストされた呼び出しであり、文字列内の任意の文字を含めることができます。
ベストアンサー1
「正規表現は重要ではない」という言葉を覚えておいてください。
この場合、多くの「簡単な」Unixツールが正規表現に基づいているため、これが重要です。ここでの数は、Test_Macroのパラメータに使用できる左右の角括弧(「括弧」)の数です。
Test_Macroを呼び出すといいえネストされた括弧がある場合は、簡単なトリックがあります。まず、)
各文字を改行文字に変更するか、その逆に変更します。次に、Test_Macroを含まないすべての行を削除し、Test_Macroより前のすべての行を削除します。この時点で処理されたFile2.txtの一部は次のとおりです。
Test_Macro(abc, def, " string1 string2 test string",) "test string2 ",) 123456
今)
すぐ変換する必要があります。この時点ではいくつかのオプションがあります。私は余分なスペースを取り除きながらsedを使用することを好みます。もう一度追加する必要が)
あります。;
これを総合すると、
find . -type f | while read -r fn
do
< "$fn" tr ')\n' '\n)' | sed -n 's/.*Test_Macro(/Test_Macro(/p' | \
sed 's/) */ /g;s/$/);/'
done
Test_Macroのパラメータに入れ子の括弧を含めることができる場合は、パターン一致だけでなく入力も解析する必要があるため、より大きな銃を取り出す必要があります。 (理論的に入れ子になったレベルを制限できればパターンマッチングを実行できますが、実際には非常に高速に複雑になるため、このアプローチをあきらめる必要があります。)を構築することができます。