このようなファイルがあります
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