パターンを見つけてすべてのファイルから削除する[閉じる]

パターンを見つけてすべてのファイルから削除する[閉じる]

次の問題を解決するのに役立ちます。\ 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のパラメータに入れ子の括弧を含めることができる場合は、パターン一致だけでなく入力も解析する必要があるため、より大きな銃を取り出す必要があります。 (理論的に入れ子になったレベルを制限できればパターンマッチングを実行できますが、実際には非常に高速に複雑になるため、このアプローチをあきらめる必要があります。)を構築することができます。

答え2

編集:この回答は質問が修正される前に準備されました。質問の元の形式は次のとおりです。

特定のパターンを見つけるために「grep」を使用しようとすると、最初の行だけが印刷されます。しかし、私はブラケットが終わるまで欲しいです。

正規表現は計算できませんが、Sedは繰り返すことができます。

Test_Macro以下は、適切な閉じ括弧を使用して to を含むすべての行から取得する Sed スニペットです。入れ子の括弧がある場合でも:

#n
/Test_Macro/{
  p;
  :rep
  s/([^()]*)//;
  trep
  /^[^(]*$/d;
  h;
  n;
  p;
  x;
  G;
  brep
}

1行のコードに変換すると、次のようになります。

sed -n -e '/Test_Macro/{p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/d;h;n;p;x;G;brep' -e '}'

入力と出力は次のとおりです。

$ cat temp 
Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n");
// Some code or text

Test_Macro(asdsadas, "test String1");
// Some code...
$ sed -n -e '/Test_Macro/{p;:rep' -e 's/([^()]*)//;trep' -e '/^[^(]*$/d;h;n;p;x;G;brep' -e '}' temp 
Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n");
Test_Macro(asdsadas, "test String1");
$ 

答え3

ファイル1:

$ sed '/Test_Macro/{N;$!N;s/.*\(Test_Macro[^)]*);\).*/\1/;p;};d' abc.txt
Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n");
Test_Macro(asdsadas, "test String1");

ファイル2:

$ sed '/Test_Macro/{N;$!N;s/.*\(Test_Macro[^)]*);\).*/\1/;p;};d' abc2.txt
Test_Macro(abc, def, "\n string1 string2 \n test string",
       "test string2 \n",
        123456);
Test_Macro(asdsadas, "test String1");

ps。すべての改行文字を削除する最も簡単な方法は次のとおりです。

echo -e "line \n break" | tr "\n" " "

改行はありません。

$ sed ':a;N;$!ba;s/[^;]\n[ ]*/ /g;' abc2.txt  | grep Test_Macro
Test_Macro(abc, def, "\n string1 string2 \n test string" "test string2 \n" 123456);
Test_Macro(asdsadas, "test String1");

「\n」はないのに改行文字がありますね…

$ sed '/Test_Macro/{N;$!N;s/[ ]*\\n//g;s/.*\(Test_Macro[^)]*);\).*/\1/;p;};d' abc2.txt
Test_Macro(abc, def, " string1 string2 test string",
       "test string2",
        123456);
Test_Macro(asdsadas, "test String1");

「\n」文字列(および末尾のスペース)のみを削除してください。

$ sed ':a;N;$!ba;s/\\n[ ]*//g;' abc2.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関数内の文字列 "\ n"を削除します。ただし、関数の外では削除せず、改行文字を削除しないでください。

$ sed '{N;/Test_Ma/{s/[ ]*\\n//g;};s/\(Test_Macro[^)]*);\)/\1/};' abc2.txt
Test_Macro(abc, def, " string1 string2 test string",
       "test string2",
        123456);
// Some code or text \n

Test_Macro(asdsadas, "test String1");
// Some code...

修正する。

$ sed '{:a;N;/Test_Ma/{s/[ ]*\\n//g;};ta};' abc2.txt 
Test_Macro(abc, def, " string1 string2 test string",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
       "test string2",
        123456);
// Some code or text \n
// Some code or text \n
// Some code or text \n
// Some code or text \n
// Some code or text \n
// Some code or text \n
// Some code or text \n
// Some code or text \n
// Some code or text \n
// Some code or text \n

Test_Macro(asdsadas, "test String1");
// Some code...

関連情報