Sed
sed:刪除匹配前的所有行,包括這一行
目標
如何在匹配的行之前刪除文本文件中的所有行,包括這一行?
輸入文件範例:
apple pear banana HI_THERE lemon coconut orange
期望的輸出:
lemon coconut orange
目的是在 sed 中使用“-i”選項(直接編輯)。
清潔解決方案?
大多數類似問題的答案都提出了類似的建議:
sed -n '/HI_THERE/,$p' input_file
但匹配的行沒有被刪除:
HI_THERE lemon coconut orange
然後,知道這將刪除從匹配行(包括它)到文件末尾的所有內容:
sed '/HI_THERE/,$d' input_file
我試過這樣的事情:
sed '^,/HI_THERE/d' input_file
但隨後 sed 抱怨:
sed: -e expression #1, char 1: unknown command: `^'
骯髒的解決方案
最後一個(骯髒的)解決方案是使用管道:
sed -n '/HI_THERE/,$p' input_file | tail -n +2
但是,直接編輯文件不起作用:
sed -n '/HI_THERE/,$p' input_file | tail -n +2 > input_file cat input_file # returns nothing
並且必須使用這樣的臨時文件…
sed -n '/HI_THERE/,$p' input_file | tail -n +2 > tmp_file mv tmp_file input_file
類似於您的“清潔解決方案”:
sed -e '1,/HI_THERE/d' input_file
文件中的第一行是第 1 行 - 沒有特殊
^
地址,因為您總是知道這一點,而$
末尾需要,因為您不(必然)知道那是哪一行。如果匹配行是文件的第一行,這確實會失敗。使用 GNU sed,您可以使用
0
而不是1
來處理它。對於 POSIX sed 和可移植性(在這種情況下似乎有所不同),它更複雜(請參閱下面的評論和這個後續問題)。