我有这样的输入:
xxxx1
xxxx2
xxxx3
END
xxxx4
xxxx5
我想要这个:
xxxx1
xxxx2
xxxx3
我试过了。
<<input>> | sed -n '/./,/^END/p' | sed '$d'
但我得到:
xxxx1
xxxx2
xxxx3
END
xxxx4
似乎"."在这里不起作用。
如果目标是获取所有数据直到END
并且xxxx
可以通过任何方式,则此awk
应该执行以下操作:
<<input>> | awk '/END/ {exit} 1'
xxxx1
xxxx2
xxxx3
- 如果找到
END
,请退出 1
始终为 true,并且由于没有操作,请执行默认操作,打印
这可能对你有用(GNU sed(:
sed '/^END$/Q' file
打印所有行,直到仅包含END
行,然后退出。
另类:
sed -n '/^END$/q;p' file
这是一个使用awk
的解决方案。
awk '/^xxxx/{f=1}/^END/{f=0;exit}{ if (f!=0){print $0}}' file
输出
xxxx
xxxx
xxxx
f=1
设置一个标志以指示已找到起始值。只要设置了该标志值,(我们对其进行测试(if (f!=0)
,我们打印当前输入行。当找到终止值/^END/
时,变量未设置,我们必须退出,因为在这种情况下,将再次找到起始值,并打印出来。
希斯
使用 POSIX sed:
sed '/^END/,$d'
或
sed -n '1,/^END/{/^END/!p}'