![](/img/trans.png)
[英]sed to replace lines matched by a pattern range if one line match a condition
[英]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 -n '/ABC/,/^[^+]/{x;/^$/!p;}' file
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.