3 回答

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

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

TA貢獻(xiàn)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 關(guān)注
- 893 瀏覽
添加回答
舉報