如何匹配以 grep 结尾的 unix 行?我已经有一个使用 unix2dos
和 cmp
的工作脚本,但它有点慢,单个 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
$