如何从匹配行后面开始删除文件中的所有行?
我有一个由几行文本组成的文件:
The first line The second line The third line The fourth line
我有一个string是其中一行: The second line
我想删除string和文件后面的所有行,所以除了string之外,它会删除The third line
和The fourth line
。 该文件将成为:
The first line
我在谷歌上search了一个解决scheme,似乎我应该使用sed
。 就像是:
sed 'linenum,$d' file
但是如何findstring的行号呢? 或者,我该怎么做呢?
如果您不想打印匹配的行(或任何以下行):
sed -n '/The second line/q;p' inputfile
这就是说“当你到达符合模式退出的行时,否则打印每一行”。 -n
选项可防止隐式打印,并且需要使用p
命令才能明确地打印行。
要么
sed '/The second line/,$d' inputfile
这就是说“从匹配行开始的输出中删除所有行,并继续到文件末尾”。
但第一个是更快。
如果您想要打印匹配的行,但不是以下任何行:
sed '/The second line/q' inputfile
这表示“打印所有行并在到达匹配的行时退出”(不使用-n
选项(不隐式打印))。
请参阅man sed了解更多信息。
这比其他给定的解决scheme稍微短一些。 退出使用大写Q避免打印当前行。
sed '/The second line/Q' file
要实际删除行,可以使用相同的语法。
sed -i '/The second line/Q' file
sed '/The second line/q0' file
或者,没有gnu sed:
sed '/The second line/q' file
或者,使用grep:
grep -B 9999999 "The second line"
使用awk(不显示匹配的行)
awk '/pattern/ {exit} {print}' file.txt
首先添加行号并删除行
cat new.txt The first line The second line The third line The fourth line cat new.txt | nl 1 The first line 2 The second line 3 The third line 4 The fourth line cat new.txt | nl | sed "/2/d" 1 The first line 3 The third line 4 The fourth line cat new.txt | nl |sed "3d;4d" 1 The first line 2 The second line
使用awk
awk 'NR!=3 && NR!=4' new.txt The first line The second line
awk '/The second line/{exit}1' file