2017-09-05 23 views
2

我需要刪除,(之間的多條線,包括圖案以及第一次出現時的兩條線。刪除殼中兩個圖案之間的線

Test , 

this 

is the 
deletion 
part 
(
done... 

期望輸出

Test 
done 

我已經嘗試了以下使用sed來實現上述輸出,但它只是返回整個文件數據。

sed 's/,*(//' file 

在此先感謝。

+0

請解釋你的代碼(你打算工作的方式,而不是它的工作方式),它似乎與你描述的目標非常無關,這使得問題變得模糊不清。 – Yunnosch

+0

@Yunnosch我提供了一個例子,說明我打算如何使用代碼:) –

回答

2

awk更適合在這裏:

awk '/,/{p=1; sub(/[ \t]*,.*/, ""); print} !p; /\(/{p=0}' file 

Test 
done 

另外,您還可以使用perl

perl -i -0777 -pe 's/\h*,.*\(//s' file 

或者這個表達式用否定字符類,不要求s修改:

perl -i -0777 -pe 's/\h*,[^(]*\(//' file 
+1

'[\ s \ S]'nice':-)' –

+1

其他選項是使用's'修飾符,如''s〜 (?s)。* \(~~'' – anubhava

+2

perl更經常使用修飾符以外的正則表達式/...// s' –

0

With sed:

sed '/Test/,/done/{//!d;s/ ,$//}' file 

/Test/,/done/:從線路匹配Test高達下一行匹配done

  • //!d刪除除了匹配地址(Test ,done
  • s/ ,$//去除從第一發生,所有行地址
+1

介意解釋你的代碼是如何工作的? – bfontaine

+1

@bfontaine我添加了一些解釋。 – SLePort

0

這可能爲你工作(GNU SED):

sed -z 's/,[^(]*(//g' file 

啜食整個文件到內存和全局替換,(什麼也沒有之間的任何字符。

0
awk '{sub(/ ,|\.../,"")}NR==1;END{print}' file 

Test 
done 
+0

這不符合OP的要求 - 它應該從「,」中刪除,直到「(」(也可以稍微解釋一下它的工作原理!) – psmears

相關問題