2016-08-10 5 views
1

ファイル内にキャレット(^)文字を見つけようとしていて、 。私はこれをbashで実行しています。's /([ ^] [^])// g'で終了しない 's'コマンド

私がしようとすると、任意の時間がそうするようにsedを実行します。

sed: -e expression #1, char 14: unterminated `s' command 

任意のアイデア:

sed -i 's/([\^][^])//g' myfile.txt 

が、私は以下のエラーを取得しますか?

+0

'^'が行末にある場合はどうしますか?簡潔でテスト可能なサンプル入力と期待される出力を含めるようにあなたの質問を編集してください。 –

+0

同じ行動 - 私は皆さんもこの辺縁の事件を心配するとは思わなかった。ありがとう。 – dvasdekis

答えて

3

表現[^]が未完成で、必要に応じて不足している][^]])があります。しかし、それは閉鎖]と一致します、あなたが欲しいものは何もありません(私は信じています)。

私があなたが信じることは、カラダに一致することです:\^。しかし、あなたが書いたもの([\^])もカラットと一致しません。 \^.
:意図以降の文字は任意の文字、使用された場合

find any carat (^) ... and delete them and the subsequent character whenever they exist

$ echo 'abc\def^ghij' 
abc\def^ghij 

$ echo 'abc\def^ghij' | sed 's/[\^]//g' 
abcdefghij 

しかし、たとえそれはあなたが書かれていませんされているもの:それはバックスラッシュ\またはカラット^のいずれかと一致します次の文字がカラットでない文字の場合は、\^[^\^]
を使用するか、または単に:\^[^^]

0123ある
$ echo 'ab\cd^^ef^gh' | sed 's/\^[^^]//g' 
ab\cd^fh 

sed -i 's/\^[^^]//g' infile 

は、あなたが探しているものということですか?

+0

'\ ^。'は完全に働いた。乾杯! – dvasdekis

3

セクション[^]は文字クラスではありません。 ]ブラケットがネゲートされた文字クラスの最初の文字で、コードが次に](文字クラスの一部として)//gのすべてを扱う)を探していて、終了マーカーが見つからないため、エラーにつながります。

肯定的な場合は、[][]を使用して、文字クラスに近い角かっこまたは開いた角かっこを探すことができます。負のバージョンは[^][]です。

[^]]を使用すると、エラーメッセージが表示されなくなります。正規表現を修正する必要があります。

デフォルトでは、カッコはグループ化メタ文字としてではなく、かっことして解釈されます(これには\(…\)が必要です)。実際、グループ化の必要はないので、かっこは以下の説明から除外されます。

あなたの正規表現への修正は、質問を再読したときに中程度にクリアされます。キャレットとそれに続く文字を削除しようとしています。それは少しあいまいです。キャレットが行末にある場合(次の文字が改行文字なので)、改行も削除する必要がありますか?私はそうしないと思います。私はまた^^が削除されるべきであると仮定します。その質問は、「次の文字もキャレットでない限り、ファイル内の任意のキャレット(^)文字を削除し、後続の文字を削除する」と言います。明らかに、どちらかの仮定が間違っていれば正規表現は微調整できます(ただし、改行の前提は扱いにくいですがかなりのマージン)。

sed 's/\^.\{0,1\}//g' 

1は、同じ行に、そこにある場合、これは、次の文字(文字クラスを避ける)キャレットを探します - \{0,1\}表記は、前の表現の0または1の繰り返しを意味します。

sedのバリアントが拡張正規表現をサポートしている場合は、sed -E 's/\^.?//g'(Mac OS XおよびBSD)またはsed -r 's/\^.?//g'(GNU)を使用できます。

キャレットだけで構成される文字クラスは、POSIXでは実際にサポートされていません。 [\^]表記は( 'またはキャレット'?)、バックスラッシュとカレットからなる文字クラスです:

$ echo 'abc\de^Afg' | sed 's/[\^].\{0,1\}//g' 
abcefg 
$ echo 'abc\de^Afg' | sed 's/\^.\{0,1\}//g' 
abc\defg 
$ echo 'abc\de^Afg' | sed -E 's/\^.?//g' 
abc\defg 
$ echo 'abc\de^Afg' | /opt/gnu/bin/sed 's/[\^].\{0,1\}//g' 
abcefg 
$ echo 'abc\de^Afg' | /opt/gnu/bin/sed 's/\^.\{0,1\}//g' 
abc\defg 
$ echo 'abc\de^Afg' | /opt/gnu/bin/sed -r 's/\^.?//g' 
abc\defg 
$ 

(プレーンsedは、Mac OS X sedであり、/opt/gnu/bin/sedはGNU sedです。)

2

find any carat (^) characters in my file, and delete them and the subsequent character

のは、このテストファイルを見てみましょう:

$ cat myfile.txt 
a^2 b^2 c 

私はこれが何をしたいんと信じています:

$ sed 's/\^.\?//g' myfile.txt 
a b c 

ご存知のように、^は、正規表現、アクティブ文字は通常です。文字通り^と一致するように、それをエスケープする必要があります。正規表現では、.は任意の文字に一致します。したがって、\^.は、任意の文字が続くキャレットと一致します。正規表現\^.\?は、次の文字がある場合は、キャレットと次の文字と一致します。文字のネガティブリストとしてカラット^]を使用しているsedのため

+0

これは、行末のキャレットは削除しませんが、それを修正するのは難しくありません。そして、 '\^.'は改行以外の文字が後に続くキャレットと一致します。 –

+0

@JonathanLeffler OPのステートメントをそのように解釈することは合理的です。回答が更新されました。 – John1024

関連する問題