2017-02-07 4 views
1

の途中から特殊文字を削除し、期待通りに動作していないSED 。だから、結果は次のようになります。は私が内容をファイル「テスト」が文字列

save 
hello 
test 
teve 
help! 
please! 

私はcat test | sed 's/\([:lower:]\)\!\([:lower:]\)/\1\2/g'とアルファ/ alphanum奇妙なを試してみた、それだけで単語「!LO HELない」と何ものために働いて、私の結果はされている:

sa!ve 
hello 
te!st 
te!ve 
help! 
please! 

他の言葉ではうまくいかない理由がわかりません。

+0

Cat warningの無用な使用。 'sed '...' test'を検討してください – bishop

答えて

4

問題は、文字クラスを誤って使用していることです。 [:lower:]は、文字セットの名前なので、実際には[[:lower:]]のように使用します。

は、そのための正しいsedの式は次のとおりです。期待どおりに動作

cat test | sed 's/\([[:lower:]]\)\!\([[:lower:]]\)/\1\2/g' 

ここで私が手出力です:

save 
hello 
test 
teve 
help! 
please! 

ですから、その場で文字を作成するときに、これは[[:lower:]]なり、a-zため[:lower:]として速記と考えることができますが。多くの人が最初の2〜3回で噛まれるというのは難しいことです。

+0

ありがとうございます。期待どおりに動作します。違いがあり、生きて学習することを知っておくとよいでしょう。 – TryTryAgain

1

文字クラスを使用しているため、[:lower:]は大括弧内の任意の1文字になります。あなたの入力では、(文字クラス:lower:にある)lだけが一致するようになり、置き換えられます。

範囲内の小文字のアルファベットと一致する文字範囲[a-z]に変更します。

cat test | sed 's/\([a-z]\)\!\([a-z]\)/\1\2/g' 
+2

または、より良い、' [[lower:]] 'はロケールセーブです。 –

+0

うーん、うまくいく。ガイダンスのおかげで、まだ動作しない理由はまだ分かりません。私は文字クラスと文字の範囲/セットを使用するものを調べなければならないでしょう。 – TryTryAgain

+2

[POSIX仕様](http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html#tag_09_03)(REブラケット表現/文字クラス)を参照してください。 –

関連する問題