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