【发布时间】:2022-01-07 16:45:47
【问题描述】:
我想删除从开始到第一个模式匹配的行。(但模式行除外)
原始.txt
11
22
33
44
55
TEST line
66
77
TEST line2
expected.txt
TEST line
66
77
TEST line2
我正在使用 Ubuntu。 如何使用 sed 做到这一点?
【问题讨论】:
标签: sed
我想删除从开始到第一个模式匹配的行。(但模式行除外)
原始.txt
11
22
33
44
55
TEST line
66
77
TEST line2
expected.txt
TEST line
66
77
TEST line2
我正在使用 Ubuntu。 如何使用 sed 做到这一点?
【问题讨论】:
标签: 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\)/\1/;s/\(TEST line2\n\).*/\1/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 '$0 == "TEST line" {p=1} p'
【讨论】: