我想忽略在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 the
1 /模式/ 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
将该范围内的模式空间回显到stdoutinput_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
是输入文件这有点棘手,但很容易记住以快速获得所需的输出:
$ 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。