刪除正規表示式後面的文字直到行尾

刪除正規表示式後面的文字直到行尾

我有一個這樣的文件

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

相關內容