web-dev-qa-db-ja.com

どのようにsedで正規表現を「デバッグ」しますか?

sedを使用して正規表現を使用しようとしています。 regexpdをテストするgnomeアプリケーションであるkikiで正規表現をテストしましたが、kikiで動作します。

date: 2010-10-29 14:46:33 -0200;  author: 00000000000;  state: Exp;  lines: +5 -2;  commitid: bvEcb00aPyqal6Uu;

author: 00000000000;を何もないものに置き換えたい。だから、私はキキでそれをテストするときに動作する正規表現を作成しました:

author:\s[0-9]{11};

しかし、sedでテストすると動作しません。

sed -i "s/author:\s[0-9]{11};//g" /tmp/test_regex.txt

正規表現にはさまざまな実装があることは知っていますが、これが問題になる可能性があります。私の質問は、少なくともsedで何が起こっているのかを「デバッグ」するにはどうすればいいですか?なぜ機能しないのですか?

私のバージョンのsed{11}ビットが好きではありません。以下でラインを処理します:

sed 's/author: [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9];//g'

正常に動作します。

そして、それをデバッグする方法は、まさにここでやったことです。コマンドを作成しました。

echo 'X author: 00000000000; X' | sed ...

より高度な正規表現を1つずつ削除しました。

  • <space>の代わりに\sを使用しましたが、修正しませんでした。
  • [0-9]{11}[0-9]の11個のコピーに置き換え、機能しました。

以前にsedで正規表現の他のすべての機能を使用したことがあるので、ほとんどhadになります。

しかし、実際には、このwillは、[0-9]の11個の恐ろしいコピーなしで実際に動作します。中括弧[0-9]\{11\}をエスケープする必要があります。倍数でも問題なく機能し、sedの簡潔さについてはあまり気にしません。 '汚い仕事:-)

しかし、ブレースメソッドisは、はるかに簡潔で順応性があり、その方法を知っていると便利です。

21
paxdiablo

Sedでは、中括弧をエスケープする必要があります。 "s/author:\s[0-9]\{11\};//g"動作するはずです。

Sedにはデバッグ機能がありません。テストするには、何かが機能するようになるまでコマンドラインで繰り返し単純化してから、ビルドし直します。

コマンドライン入力:

$ echo 'xx a: 00123 b: 5432' | sed -e 's/a:\s[0-9]\{5\}//'

コマンドライン出力:

xx  b: 5432
21
verisimilidude

Python Aurelio Jargasによるsedsedと呼ばれるスクリプトがあり、sedスクリプトの段階的な実行を表示します。このようなデバッガーは役に立ちません。文字が文字どおりに使用される場合(例:{)と特別な意味(たとえば、\{)、特に単純な置換の場合ですが、より複雑なスクリプトをデバッグするときに役立ちます。

最新のSVNバージョン
最新の安定版リリース
免責事項:私はsedsedのマイナーな貢献者です。

sedsed example

別のsedデバッガー、 sd Brian Hilesにより、Bourne Shellスクリプトとして記述されています(これは使用していません)。

17

拡張正規表現には-rフラグを使用する必要があります。

sed -r 's/author:\s[0-9]{11};//g'

または、{}文字をエスケープする必要があります。

sed 's/author:\s[0-9]\{11\};//g'
12
Ray

これは、sed正規表現よりもPerl正規表現のように見えます。おそらくあなたは使うことを好むでしょう

Perl -pi.orig -e 's/author:\s[0-9]{11};//g' file1 file2 file3

少なくともそのようにすると、常に-Mre=debug正規表現をデバッグします。

2
tchrist

-iフラグを誤って使用しています。一時ファイルに配置する文字列を指定する必要があります。また、中括弧をエスケープする必要があります。

sed -ibak -e "s/author:\s[0-9]\{11\};//g" /tmp/test_regex.txt

私は通常、動作することがわかっている正規表現(この場合は「s/author // g」など)から開始してステートメントをデバッグします。それがうまくいくとき、私は正しい議論があることを知っています。次に、正規表現を段階的に展開します。

2
Brian Clements

sedコマンドをデバッグする場合は、w(書き込み)コマンドを使用して、sedがファイルに一致した行をダンプできます。

sed manpagesから:

アドレス範囲を受け入れるコマンド

(...)

wファイル名

現在のパターンスペースをfilenameに書き込みます。


質問に適用する

sed_dump.txtという名前のファイルをsedダンプファイルとして使用しましょう。

1)sedダンプを生成します。

sed "/author:\s[0-9]{11};/w sed_dump.txt" /tmp/test_regex.txt

2)ファイルの確認sed_dump.txt内容:

cat sed_dump.txt

出力:

それは空です...

3) '{'正規表現制御文字をエスケープしようとしています:

sed "/author:\s[0-9]\{11\};/w sed_dump.txt" /tmp/test_regex.txt

4)ファイルの確認sed_dump.txt内容:

cat sed_dump.txt

出力:

日付:2010-10-29 14:46:33 -0200;著者:00000000000;状態:Exp;行:+5 -2; commitid:bvEcb00aPyqal6Uu;

結論

ステップ4)では、行が一致しました。これは、sedがその行のパターンと一致したことを意味します。正しい答えを保証するものではありませんが、sed自体を使用してデバッグする方法です。

1
gagallo7

author: 00000000000を置換しているという事実は、最初の/の前にsedを追加するときにsで既に述べています。

0