簡體   English   中英

除了與范圍結束模式匹配的行之外,如何使用 sed 打印一系列行?

[英]How to print a range of lines with sed except the one matching the range-end pattern?

我想知道是否有一種sed方法來打印一系列行,由要匹配的模式確定,除了最后一行匹配結束模式。

考慮以下示例。 我有一個文件

line  1
line  2
line  3
ABC line  4
+ line  5
+ line  6
+ line  7
line  8
line  9
line 10
line 11
line 12

我想得到以ABC (包括)開頭的所有內容以及以+開頭的所有行:

ABC line  4
+ line  5
+ line  6
+ line  7

我試過了

sed -n '/ABC/I,/^[^+]/ p' file

但這給出了太多的一行:

ABC line  4
+ line  5
+ line  6
+ line  7
line  8

什么是最簡單的方法( sed )留下最后一行?

可能有更好的方法,但我可以想出這個 sed 1 班輪:

sed -rn '/ABC/,/^[^+]/{/(ABC|^\+)/!d;p;}' file

另一個 sed 1 內膽是

sed -n '/ABC/,/^[^+]/{x;/^$/!p;}' file

還有一個 sed 1 襯管(可能更好)

sed -n '/ABC/I{h;:A;$!n;/^+/{H;$!bA};g;p;}' file

最簡單的方法(如果有人可以通過調用 sed 來解決這個問題,我會學到一些新東西),是在最后添加一個額外的 sed,即

sed -n '/ABC/I,/^[^+]/ p' file | sed '$d'
ABC line  4
+ line  5
+ line  6
+ line  7

作弊,我知道,但這就是 Unix pipe 哲學的美妙之處。 繼續減少您的數據,直到您得到您想要的;-)

我希望這有幫助。

這可能對您有用:

 sed '/^ABC/{:a;n;/^\(ABC\|+\)/ba};d' file

編輯:允許相鄰的ABC部分。

好吧,你已經選擇了你的答案。 但是你為什么不使用/^(ABC|\+)/ 還是我誤解了您的要求?

如果您想在找到 ABC 搜索后找到那些+

awk '/ABC/{f=1;print} f &&/^\+/ { print }' file

這比制作神秘sed表達式更容易理解。 當找到 ABC 時,設置一個標志。 當找到以 + 開頭的行並設置標志時,打印行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM