如何在bash中匹配之前忽略所有行?

geo*_*xis 17 bash

我想忽略在bash中匹配之前出现的所有行(也忽略匹配的行.输入的示例可能是

R1-01.sql
R1-02.sql
R1-03.sql
R1-04.sql
R2-01.sql 
R2-02.sql
R2-03.sql
Run Code Online (Sandbox Code Playgroud)

如果我匹配R2-01.sql这个已经排序的输入,我想得到

R2-02.sql
R2-03.sql
Run Code Online (Sandbox Code Playgroud)

jm6*_*666 21

有很多方法可行.例如:假设您的输入位于list.txt中

PATTERN="R2-01.sql"
sed "0,/$PATTERN/d" <list.txt
Run Code Online (Sandbox Code Playgroud)

因为,0,/pattern/仅在GNU sed上工作(例如,在OS X上不起作用),这是一个被篡改的解决方案.;)

PATTERN="R2-01.sql"
(echo "dummy-line-to-the-start" ; cat - ) < list.txt | sed "1,/$PATTERN/d"
Run Code Online (Sandbox Code Playgroud)

这将在开始时添加一条虚拟线,因此实际模式必须在1或更高的线上,因此1,/pattern/将起作用 - 删除从第1行(虚拟的)到模式的所有内容.

或者您可以在模式后打印行并删除第1行,如:

sed -n '/pattern/,$p' < list.txt | sed '1d'
Run Code Online (Sandbox Code Playgroud)

用awk,例如:

awk '/pattern/,0{if (!/pattern/)print}' < list.txt
Run Code Online (Sandbox Code Playgroud)

或者,我最喜欢使用下一个perl命令:

perl -ne 'print unless 1../pattern/' < list.txt
Run Code Online (Sandbox Code Playgroud)

当模式在第一行时删除第1.行...

另一种解决方案是反向删除 - 反向

tail -r < list.txt | sed '/pattern/,$d' | tail -r
Run Code Online (Sandbox Code Playgroud)

如果你有tac命令用它来代替tail -r的东西interesant比/pattern/,$d' works on the last line but the1 /模式/ D'不上第一.


Joh*_*web 13

如何在bash中匹配之前忽略所有行?

问题标题和你的例子并不完全匹配.

打印所有行在"R2-01.sql" sed:

sed -n '/R2-01.sql/,$p' input_file.txt
Run Code Online (Sandbox Code Playgroud)

哪里:

  • -n 禁止将图案空间打印到标准输出
  • / 开始和结束模式匹配(正则表达式)
  • , 将范围的开始与结束分开
  • $ 解决输入中的最后一行
  • p 将该范围内的模式空间回显到stdout
  • input_file.txt 是输入文件

"R2-01.sql" 之后打印所有行sed:

sed '1,/R2-01.sql/d' input_file.txt
Run Code Online (Sandbox Code Playgroud)
  • 1 解决输入的第一行
  • , 将范围的开始与结束分开
  • / 开始和结束模式匹配(正则表达式)
  • $ 解决输入中的最后一行
  • d 删除该范围内的模式空间
  • input_file.txt 是输入文件
  • 未删除的所有内容都会回显到stdout.


dim*_*414 7

这有点棘手,但很容易记住以快速获得所需的输出:

$ grep -A99999 $match $file
Run Code Online (Sandbox Code Playgroud)

显然,您需要选择一个-A足够大的值以匹配所有内容;如果您使用的值太小,输出将被静默截断。

为确保您获得所有输出,您可以执行以下操作:

$ grep -A$(wc -l $file) $match $file
Run Code Online (Sandbox Code Playgroud)

当然,那时您可能会更好地使用sed解决方案,因为它们不需要对文件进行两次读取。

如果您不想要匹配的行本身,您可以简单地将此命令输入tail -n+1跳过第一行 output

  • 使用文件的“wc -l”的后一个“grep”命令是我见过的唯一真正可移植且灵活的解决方案。 (3认同)