行末までの正規表現の後のテキストを削除します。

行末までの正規表現の後のテキストを削除します。

このようなファイルがあります。

this is a year (2004); this text is not insteresting
singer elton john; month and year (December, 2005); blah blah
this another year (2007); irrelevant text

あけましておめでとうございます。

this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

これはうまくいきません

sed -E 's/\(.*\)[0-9]{4});\(.*\)/\2/' file

sedまたはawkを使用してこれをどのように実行できますか?

答え1

自分が欲しいものを書き込む効果的な方法は次のとおりです。

sed -E 's/(.*[0-9]{4}\);).*/\1/' file

yyyy);これにより、各行の最後の項目以降のすべての行文字が削除されます。

あなたの試みは

sed -E 's/\(.*\)[0-9]{4});\(.*\)/\2/' file

ただし、-E拡張正規表現フラグが有効なため、一致\( \)グループは分離されませんが、ファイルのリテラル角かっこは一致し、一致( )グループは分離されます。したがって、括弧が一致せず、[0-9]{4})sedが文句を言います。

sed: -e expression #1, char 28: Unmatched ) or \)

答え2

いつも一つしかなかったら);簡単でしょう。

$ sed 's/);.*/);/' file 
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

より多くのものがあり、最後のもの以降のすべてを削除したい場合:

$ sed -E 's/(.*)\);.*/\1);/' file 
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

)4つの数字()の後に一致を入力しようとしましたが、\)[0-9]{4}入力に対応する数字がないため機能しません。私はあなたが次のようなものを書こうとしていると思います:

$ sed -E 's/(.*[0-9]{4}\);).*/\1/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

答え3

使用grep(オプションをサポートするバージョンがあると仮定-o

$ grep -oE '.*[0-9]{4});' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

-oオプションを選択すると、一致grepする部分のみが印刷されます。したがって、sedこのパターンを含まない行は印刷されないため、これはコマンドとまったく同じではありません。

答え4

あなたの例では、最後の行以降のすべての行を切り捨てます;。これはsed逆参照を必要としない簡単な作業です。

$ sed 's/;[^;]*$/;/' file
this is a year (2004);
singer elton john; month and year (December, 2005);
this another year (2007);

または以下を使用してawk

awk -F ';' 'BEGIN { OFS=FS } { $NF=""; print }' file

関連情報