Sed

sed:刪除匹配前的所有行,包括這一行

  • August 9, 2019

目標

如何在匹配的行之前刪除文本文件中的所有行,包括這一行?

輸入文件範例:

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 和可移植性(在這種情況下似乎有所不同),它更複雜(請參閱下面的評論和這個後續問題)。

引用自:https://unix.stackexchange.com/questions/533512