3 回答

TA貢獻1839條經(jīng)驗 獲得超15個贊
我會去解決的。
要刪除模式后的5行(包括帶有模式的行):
sed -e '/pattern/,+5d' file.txt
要刪除模式后的5行(不包括帶有模式的行):
sed -e '/pattern/{n;N;N;N;N;d}' file.txt

TA貢獻1831條經(jīng)驗 獲得超9個贊
簡單的awk解決方案:
假定用于查找匹配行的正則表達式存儲在shell變量中$regex,而要跳過的行數(shù)也存儲在shell變量中$count。
如果還應該跳過匹配的行(也跳過$count + 1行):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; next } --skip >= 0 { next } 1'
如果不應該跳過匹配的行(跳過匹配之后的$count行):
... | awk -v regex="$regex" -v count="$count" \
'$0 ~ regex { skip=count; print; next } --skip >= 0 { next } 1'
說明:
-v regex="$regex" -v count="$count"awk基于同名的shell變量定義變量。
$0 ~ regex 符合興趣線
{ skip=count; next }初始化跳過計數(shù)并前進到下一行,有效地跳過匹配的行;在第二個解決方案中,print之前next確保不跳過它。
--skip >= 0 減少跳過計數(shù)并在(仍然)> = 0時采取措施,這意味著應跳過當前行。
{ next } 前進到下一行,有效跳過當前行
1是常用的簡寫{ print }; 也就是說,僅打印當前行
只有不匹配和不跳過的行才能到達此命令。
其原因1是相當于{ print }是1被解釋為布爾圖案,根據(jù)定義總是評估為真,這意味著被無條件地執(zhí)行其相關聯(lián)的動作(塊)。由于在這種情況下沒有關聯(lián)的操作,因此awk默認情況下將打印該行。

TA貢獻1876條經(jīng)驗 獲得超7個贊
使用Perl
$ cat delete_5lines.txt
1
2
3
4
5 hello
6
7
8
9
10
11 hai
$ perl -ne ' BEGIN{$y=1} $y=$. if /hello/ ; print if $y==1 or $.-$y > 5 ' delete_5lines.txt
1
2
3
4
11 hai
$
- 3 回答
- 0 關注
- 881 瀏覽
添加回答
舉報