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は、はるかに簡潔で順応性があり、その方法を知っていると便利です。
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
Python Aurelio Jargasによるsedsed
と呼ばれるスクリプトがあり、sed
スクリプトの段階的な実行を表示します。このようなデバッガーは役に立ちません。文字が文字どおりに使用される場合(例:{
)と特別な意味(たとえば、\{
)、特に単純な置換の場合ですが、より複雑なスクリプトをデバッグするときに役立ちます。
最新のSVNバージョン 。
最新の安定版リリース 。
免責事項:私はsedsed
のマイナーな貢献者です。
別のsed
デバッガー、 sd
Brian Hilesにより、Bourne Shellスクリプトとして記述されています(これは使用していません)。
拡張正規表現には-rフラグを使用する必要があります。
sed -r 's/author:\s[0-9]{11};//g'
または、{}文字をエスケープする必要があります。
sed 's/author:\s[0-9]\{11\};//g'
これは、sed正規表現よりもPerl正規表現のように見えます。おそらくあなたは使うことを好むでしょう
Perl -pi.orig -e 's/author:\s[0-9]{11};//g' file1 file2 file3
少なくともそのようにすると、常に-Mre=debug
正規表現をデバッグします。
-iフラグを誤って使用しています。一時ファイルに配置する文字列を指定する必要があります。また、中括弧をエスケープする必要があります。
sed -ibak -e "s/author:\s[0-9]\{11\};//g" /tmp/test_regex.txt
私は通常、動作することがわかっている正規表現(この場合は「s/author // g」など)から開始してステートメントをデバッグします。それがうまくいくとき、私は正しい議論があることを知っています。次に、正規表現を段階的に展開します。
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
自体を使用してデバッグする方法です。
author: 00000000000
を置換しているという事実は、最初の/
の前にsed
を追加するときにs
で既に述べています。