我有一個這樣的文件
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