2017-03-16 75 views
1

假設我想爲以「start」開頭的每一行添加單詞「end」。但是,如果「結束」一詞已經在行尾;不需要再添加它。所以,我怎麼得到:sed:如何匹配以單詞開頭但不以另一個單詞結尾的行

start line 1 
start line 2 end 
another line 3 
start line 4 

start line 1 end 
start line 2 end 
another line 3 
start line 4 end 

此命令行的比賽開始「啓動」,但不排除與「結束」結束行。我怎樣才能得到一個正則表達式,可以同時執行這兩個操作?

sed 's/\(^start.*\)/\1 end/g' 

回答

1

用下面的辦法:

sed -i '/ end$/! s/^start .*$/& end/' testfile 

-i選項,允許修改文件到位

/ end$/! - 允許執行下一個行動(替代)僅限於那些不以結束的行字

s/^start .*$/& end/ - 僅適用於那些與start字開頭的行進行更換


如果你承認使用你的情況另一個很好的替代品的可能性,awk可能是其中之一:

awk '{print ($1 == "start" && $(NF) != "end") ? $0" end" : $0}' testfile 

$1 - 指向該第一場

$(NF) - 指向最後一個字段

+1

或者可能沒有捕獲組:'sed'/ end $ /!s/^ start。* /&end /'testfile' – SLePort

+0

@SLePort,好點,編輯 – RomanPerekhrest

相關問題