2017-10-02 13 views
1

私は大容量のファイルを持っているし、次のように線の一部は次のとおりです。なぜSedは含まれている行を置き換えることができません。 +と*

.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 

私は交換したい.... + UNKNOWN一部...+PUNCT

とそれを行うには、私は次のようにしました:

sed 's/\.\.\.\.\+\*UNKNOWN\*/\.\.\.\+PUNCT/g' myfile.out > myfile_result.out 

しかし、どの行も行っていません。

grep -F '...+*UNKNOWN*' myfile.out 

.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 
.... ....+*UNKNOWN* 

私のエラーが見つかりませんでした。お手伝いできますか?

+0

あなただけの正規表現ですべての非アルファベット文字の前にバックスラッシュを投げると最高のを期待することはできません。どの文字がリテラルであるかを識別する必要があります。これらのメタキャラクタはエスケープすることで**メタキャラクタになります。どちらのツールを使用していても、どのオプションを使用しても適切に使用できます。 –

答えて

1

sedの一部のバージョンでは、\+には特別な意味があります。プラスの文字列には、それに合わせて+を使用してください。

+0

Tnxそれはこのように働いた – zwlayer

+0

/+意味は何ですか? – zwlayer

+0

'\ +'は "1回以上"を意味するので、 '*'に似ていますが、少なくとも1回は一致しなければなりません。 – choroba

0

お試しください。

sed 's/+\*UNKNOWN/+PUNCT/' Input_file 

例と+の説明:

echo "This is an example: 123 test 123" | sed -E 's/^[^0-9]*([0-9]+).*/\1/' 
123 

でそれらを保つことによって一緒にしてから来ているの桁の非常に最初のセットと一致しますのは、私たちが[0-9]+ので、ここでラインThis is an example: 123 test 123を持っているとしましょうsedのメモリ\1を使ってそれらを印刷しています(ここでもう一度エスケープしてsedがここで呼び出すメモリシーケンスであることを知らせます)。

+0

@エドモートン、ありがとう、編集をやりました。 – RavinderSingh13

+1

@エドモートン、申し訳ありませんが、私は今それらを変更しました。いつもの指導教官としてTONに感謝します。 – RavinderSingh13

0

\+ in sedは、 '+'の直前の1つ以上の一致を意味します。つまり、+リテラルを意味します。
リテラル '+'と一致させるには、+を使用して、プラス記号とリテラルを一致させます。

修正の式:

sed 's/\.\.\.\.+\*UNKNOWN\*/\.\.\.\+PUNCT/g' myfile.out > myfile_result.out 
関連する問題