匹配以 grep 结尾的 unix 行



如何匹配以 grep 结尾的 unix 行?我已经有一个使用 unix2doscmp 的工作脚本,但它有点慢,单个 grep 命令更适合我的其余 bash 代码。

我尝试对'r'使用负面回视。

$ printf "foorn" | grep -PUa '(?<!'$'r'')$'
foo

为什么这行不通?作为记录,正则表达式模式似乎以这种方式评估得很好:

$ printf '(?<!'$'r'')$' | od -a
0000000   (   ?   <   !  cr   )   $
0000007

更新:

$ grep --version
grep (GNU grep) 2.24

在 Windows 7 上的MINGW64。

您的解决方案grep -PUa '(?<!'$'r'')$'适用于较新版本的 grep (2.25)。然而,即使在较新版本的grep中,对Perl兼容正则表达式(-P)的支持也被认为是高度实验性的,所以它在以前的版本中不起作用也就不足为奇了。

使用以下基本正则表达式:([^r]|^)$,即从bash运行时使用以下grep命令:

grep -Ua '([^'$'r'']|^)$'

演示它正确处理空行和非空行的示例:

$ printf "foonbarrnnxnrnynbazn" | grep -Ua '([^'$'r'']|^)$'
foo
x
y
baz
$

编辑

上面的解决方案将不包含行尾符号的最后一行视为以 unix 行结尾结束。 例如

$ printf "foonbar" | grep -Ua '([^'$'r'']|^)$'
foo
bar

这可以通过将人工 CRLF 附加到输入来修复 - 如果输入以换行符结尾,则多余的(空)行将被丢弃 grep ,否则删除最后一行将grep

$ { printf "foonbar"; printf "rn"; } | grep -Ua '([^'$'r'']|^)$'
foo
$

最新更新