删除正则表达式后面的文本直到行尾

删除正则表达式后面的文本直到行尾

我有一个这样的文件

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

相关内容