我有一个这样的文件
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