2

sed次の形式の入力からメールアドレスを抽出することで、慣れようとしています。

something_from.someone:user@email.com

それが に送信している入力です。sedまでのすべてを削除しようとしています::

sed 'd/[[alphanum:]]+[.][[:alphanum:]]+[:]//'

私の調査に基づいて、これでうまくいくはずですが、次のエラーが発生しています。

sed: 1: "d/[[:alphanum:]]+[.][[: ...": extra characters at the end of d command

私が間違っていることについてのアイデアはありますか?

4

1 に答える 1

4

削除構文が正しくありません。sed で削除するには、次のことを行う必要があります。

sed '(separator) [pattern to delete](separator)d'

たとえば、次のようになります。

sed -e '/regex/d' infile

これは、一般的に行全体を削除するためのものです。代わりに、行の一部を保持することで、キャプチャと置換が必要になります。

sed -e  's/regex-to-drop\(regex-to-keep\)/\1/g' input-file

\( \)「s」は代用、「g」はグローバル用\1です。一連のキャプチャーアイテムがあれば、

\(something\)\(something_else\)

sed コマンドの代替部分に次のコードを追加するだけで、それらの間に別の文字を入れて再現できました。

\1 ;; \2

これにより、次が生成されます。something ;; something_else全体としては次のようになります。

sed -e 's/\(something\)\(something_else\)/\1 ;; \2/g' input-file

あなたの場合、コロンの前にすべてを削除したいようです:

sed -e 's/^.*:\(.*\)$/\1/g' input-file

@fedorquiによって提案された上記の脚注:

Sed は標準の正規表現表記を使用して行の先頭と末尾を参照するため、「^」は行の先頭を参照し、「$」は行の末尾を参照します。したがって、上記の完全な説明は次のとおりです。

's/^.*: 

行頭からコロンまでのすべて (「s」は、「置換」コマンドを設定していることを意味します)。

それで:

\(.*\)$/ 

ラインの最後まですべてキャプチャし、

/\1/g'

キャプチャされたアイテムで WHOLE 行を置き換えます。グローバルに(ファイル全体に対して)実行します。

于 2013-07-23T15:16:06.160 に答える