[問題] 刪除匹配pattern的前幾行

看板Linux作者 (檸檬羊)時間4年前 (2020/12/05 00:01), 4年前編輯推噓6(607)
留言13則, 3人參與, 4年前最新討論串1/1
想請問如果想要刪除檔案中 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",不曉得還有沒有更好的作法~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.3.109 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1607097719.A.18E.html

12/05 12:40, 4年前 , 1F
關鍵字: hold space,歡迎進入sed的燒腦領域
12/05 12:40, 1F

12/05 13:04, 4年前 , 2F
grep -A
12/05 13:04, 2F

12/05 15:57, 4年前 , 3F
awk if匹配後狂print
12/05 15:57, 3F
※ 編輯: lemonsheep (180.177.3.109 臺灣), 12/05/2020 20:16:11

12/06 23:08, 4年前 , 4F
用 vim 的 scripting 模式吧,或用 ed
12/06 23:08, 4F

12/06 23:12, 4年前 , 5F
ex -c ':g/Snnn/-2,-1d' -c ':wq' file.txt
12/06 23:12, 5F

12/06 23:13, 4年前 , 6F
喔可以加個 -s 選項
12/06 23:13, 6F

12/06 23:13, 4年前 , 7F
因為你要做的事本質需要在檔案中來回移動,所以用 sed
12/06 23:13, 7F

12/06 23:14, 4年前 , 8F
會很不方便,sed 是用來處理串流的,只能前進不能回頭
12/06 23:14, 8F

12/06 23:16, 4年前 , 9F
or printf '%s\n' :g/Snnn/-2,-1d :wq | ex -s file.t
12/06 23:16, 9F
哇 這招很厲害,比 sed 方便多了, 感謝大大。 這樣應該是一次一行指令被 pipe 傳到 ex ※ 編輯: lemonsheep (180.177.3.109 臺灣), 12/07/2020 22:14:46

12/16 18:01, 4年前 , 10F
sed ':rn; N; s/\n/\n/3; t c; b rn; :c s/\n/\t/g'
12/16 18:01, 10F

12/16 18:02, 4年前 , 11F
sed 的 s///3 可以取代第 n 個,取代 \n 就能判斷是否
12/16 18:02, 11F

12/16 18:02, 4年前 , 12F
存在 3 個 \n 。
12/16 18:02, 12F

12/16 18:02, 4年前 , 13F
但實際上不會比較好寫
12/16 18:02, 13F
文章代碼(AID): #1Vobrt6E (Linux)
文章代碼(AID): #1Vobrt6E (Linux)