2015-12-29 35 views
1

現在我有一個簡單的文件,我想用sed上:SED嵌套組和反向引用

~ cat sample 
##tag## 
xxxxxxx 
xxxxxxx 
##tag## 

我想到的是取消對一對##標籤##線和單獨留下中間的東西。我可以這樣做(除了有一個在底部一個空行):

~ sed -r 'N;N;N; s/##tag##\n((.*\n)*)##tag##/\1/' sample 
xxxxxxx 
xxxxxxx 

但標記線並不總是整齊,因爲我想,有另外一個文件:

~ cat sample2 
##tag###dklxjexx 
xxxxxxx 
xxxxxxx 
asdf##tag###xosy 

我知道你有我點,仍然我想刪除標記行:

~ sed -r 'N;N;N; s/##tag.*\n((.*\n)*).*tag##/\1/' sample2 

但我什麼都沒有印刷!怎麼來的??

我很期待這個Q,感謝您的時間和原諒我的英語不好:)

enter image description here

所以是.比賽\n? img上方如何來?

+0

'*'表示0以上,'* '會匹配最長的匹配,這意味着您捕獲的組不會捕獲任何數據,並且第一個。* \ n與最後一行匹配。 – 123

+0

感謝您的反饋!但我發現'。*'匹配任何字符(除了換行符) – hedleyyan

+0

'。*'匹配換行符以及... – 123

回答

1

嘗試使用[^\n]*代替.*

sed -r 'N;N;N; s/[^\n]*##tag[^\n]*\n(.*)\n[^\n]*tag##.*/\1/' sample2 

此外,還需要之前考慮到其他字符/在'###tag##'標記之後。

0

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

sed '/##tag##/,//{//d}' file 

爲了保持在標籤上線細節好,用途:

sed '/##tag##/,//{s///}' file