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

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

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

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

が常に 1 つだけであれば);、非常に簡単です。

$ 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);

)あなたのコードは、a の後に 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

関連情報