刪除匹配pattern的前幾行 - Linux

Table of Contents


想請問如果想要刪除檔案中 match 到的 pattern 的前幾行要用甚摸指令?

例如:

Aaaa
Bbbb
Snnn

我知道在 vim 中的話可以用 :g/Snnn/-2,-1d

但如果用 command line 的話就不大知道怎摸達到這樣的效果

有試過 sed 但 sed 似乎只能刪除 match 到的 pattern 的後幾行


想請教各位大大有沒有比較好的方法可以達成這個目的?

感謝

===== 更新 =====

感謝推文的大大們提示

目前嘗試過後有發現一個可行的方式了,就是先反轉檔案內容再刪除 matched line 的後幾行 然後再反轉檔案,不知道還有沒有更精簡的作法~

# 反轉檔案

sed '1!G;h;$!d' file or tac file

# 刪除 match 到的 pattern 的後 2 行 (包含 matched line)

sed '/Snnn/,+2d' file

# 刪除 match 到的 pattern 的後 2 行 (不包含 matched line)

sed '/Snnn/{n;N;d}' file

# 反轉檔案 -> 刪除 matched line 後 2 行 -> 反轉檔案

sed '1!G;h;$!d' file | sed '/Snnn/,+2d' | sed '1!G;h;$!d' > file (包含 matched line)

sed '1!G;h;$!d' file | sed '/Snnn/{n;N;d}' | sed '1!G;h;$!d' > file (不包含 matched line)

但在"不包含 matched line" 的作法中似乎無法直接指定要讀入後幾行,要刪除幾行就必須要幾個 "N",不曉得還有沒有更好的作法~


--

All Comments

Elvira avatarElvira2020-12-09
關鍵字: hold space,歡迎進入sed的燒腦領域
Daniel avatarDaniel2020-12-14
grep -A
Ida avatarIda2020-12-18
awk if匹配後狂print
Valerie avatarValerie2020-12-22
用 vim 的 scripting 模式吧,或用 ed
Charlie avatarCharlie2020-12-23
ex -c ':g/Snnn/-2,-1d' -c ':wq' file.txt
Emma avatarEmma2020-12-24
喔可以加個 -s 選項
因為你要做的事本質需要在檔案中來回移動,所以用 sed
Kama avatarKama2020-12-28
會很不方便,sed 是用來處理串流的,只能前進不能回頭
Dora avatarDora2020-12-31
or printf '%s\n' :g/Snnn/-2,-1d :wq | ex -s file.t
Jacob avatarJacob2021-01-05
sed ':rn; N; s/\n/\n/3; t c; b rn; :c s/\n/\t/g'
Zanna avatarZanna2021-01-08
sed 的 s///3 可以取代第 n 個,取代 \n 就能判斷是否
存在 3 個 \n 。
但實際上不會比較好寫