在使用 sed 进行模式匹配之前删除所有行(不删除模式行)

Remove all lines before pattern matching using sed (No remove the pattern line)

我想删除从开始到第一个模式匹配的行。(但模式行除外)

original.txt

11

22
33

44

55

TEST line

66
77

TEST line2

expected.txt

TEST line

66
77

TEST line2

我正在使用 Ubuntu。 我如何使用 sed 执行此操作?

这是一种解决方案:

sed -n '/TEST line/,/TEST line2/p' original.txt > expected.txt

cat expected.txt
TEST line

66
77

TEST line2

另一个可能的选择是删除第一个模式之前的所有内容和第二个模式之后的所有内容(-z 选项需要 GNU sed),例如

sed -z 's/.*\(TEST line\n\)//;s/\(TEST line2\n\).*//g' original.txt > expected.txt

cat expected.txt
TEST line

66
77

TEST line2

您也可以使用 AWK 来完成此类任务,例如

awk '/TEST line/,/TEST line2/' original.txt > expected.txt

cat expected.txt
TEST line

66
77

TEST line2

或 grep:

grep -A 10000 "TEST line" original.txt | grep -B 10000 "TEST line2" > expected.txt

cat expected.txt
TEST line

66
77

TEST line2

如果您在问题中包含更多信息,例如您自己解决问题的尝试,则更容易提供最合适的答案。

删除第一次出现的 /pattern/ 和最后一行(含)之间 不是 的所有内容。

sed '/^TEST line$/,$!d'

您也可以使用此 awk,在整行与字符串完全匹配时开始打印(并继续打印):

awk '[=11=] == "TEST line" {p=1} p'