如何匹配以 grep 结尾的 unix 行?我已经有一个使用 unix2dos
和 cmp
的工作脚本,但它有点慢,并且单个 grep 命令可以更好地适应我的 bash 代码的其余部分.
我尝试在 '\r'
上使用负向后查找。
$ printf "foo\r\n" | 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]\|^\)$
,即以下grep
从 bash
运行时的命令:
grep -Ua '\([^'$'\r'']\|^\)$'
演示它正确处理空行和非空行的示例:
$ printf "foo\nbar\r\n\nx\n\r\ny\nbaz\n" | grep -Ua '\([^'$'\r'']\|^\)$'
foo
x
y
baz
$
编辑
上面的解决方案将最后一行视为不包含行尾符号,就好像它以 unix 行结尾一样。例如
$ printf "foo\nbar" | grep -Ua '\([^'$'\r'']\|^\)$'
foo
bar
这可以通过在输入中附加人工 CRLF 来解决 - 如果输入以换行符结尾,则额外的(空)行将被 grep
删除。 ,否则会生成grep
删除最后一行:
$ { printf "foo\nbar"; printf "\r\n"; } | grep -Ua '\([^'$'\r'']\|^\)$'
foo
$
关于bash - 匹配以 grep 结尾的 unix 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41738964/