Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何删除文件中从匹配行之后开始的所有行?_Linux_Bash_Sed - Fatal编程技术网

Linux 如何删除文件中从匹配行之后开始的所有行?

Linux 如何删除文件中从匹配行之后开始的所有行?,linux,bash,sed,Linux,Bash,Sed,我有一个由几行文本组成的文件: The first line The second line The third line The fourth line 我有一个字符串,它是其中一行:第二行 我想删除文件中的字符串及其后面的所有行,因此它将删除字符串之外的第三行和第四行。该文件将成为: The first line 我在谷歌上搜索了一个解决方案,似乎我应该使用sed。比如: sed 'linenum,$d' file 但是如何找到字符串的行号呢?或者,我该怎么做 sed '/The se

我有一个由几行文本组成的文件:

The first line
The second line
The third line
The fourth line
我有一个字符串,它是其中一行:
第二行

我想删除文件中的字符串及其后面的所有行,因此它将删除字符串之外的
第三行
第四行
。该文件将成为:

The first line
我在谷歌上搜索了一个解决方案,似乎我应该使用
sed
。比如:

sed 'linenum,$d' file
但是如何找到字符串的行号呢?或者,我该怎么做

sed '/The second line/q0' file
或者,在没有gnu的情况下:

sed '/The second line/q' file
或者,使用grep:

grep -B 9999999 "The second line"

首先添加行号并删除该行

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(不显示匹配行)


如果不想打印匹配的行(或以下任何行):

这表示“当您到达与模式匹配的行时退出,否则打印每行”。
-n
选项可防止隐式打印,需要使用
p
命令显式打印行

这表示“从匹配行开始并继续到文件末尾删除输出中的所有行”

但是第一个更快。但是,它将完全退出处理,因此如果您有多个文件作为参数,则不会处理第一个匹配文件之后的文件。在这种情况下,删除表单更好

如果确实要打印匹配的行,但不打印以下任何行:

sed -n '/The second line/q;p' inputfile
sed '/The second line/q' inputfile
这表示“打印所有行并在到达匹配行时退出”(不使用
-n
选项(无隐式打印)


有关更多信息,请参阅。

这比其他给定解决方案略短。
awk '/The second line/{exit}1' file
退出使用大写字母Q可避免打印当前行

 sed '/The second line/Q' file
要实际删除这些行,可以使用相同的语法

 sed -i '/The second line/Q' file

谢谢!你能告诉我怎样才能找到我还不知道的特定字符串的行号吗?grep-n“第二行”文件| awk-F:'{print$1}'@DocWiki:你不需要行号;你在寻找它
sed“/$string/,\$d”inputfile
。但是有些命令对破裂的管道感到不安(例如,RCS
co-p
),然后您最好使用
sed'/第二行/,$d'
符号。您能添加解释吗?@Ahmadabdelghani:添加了解释。@DennisWilliamson非常感谢。第一种方法在匹配行之前打印最后一行两次。删除
之后的
p
有效。您的问题陈述是矛盾的:“我想删除该行之后的所有行”意味着您只删除了两行(如您所说),但是您的示例输出显示匹配行也丢失了。你到底想要哪一行?匹配的行和后面的所有行。我应该提高我的英语水平。谢谢你的信息。如果我不想删除我搜索的行,那么如何删除?这是我目前最喜欢的解决方案。这是最好的答案,因为你可能不知道第二行的值。
 sed '/The second line/Q' file
 sed -i '/The second line/Q' file