gpt4 book ai didi

bash - grep 如何处理 DOS 行尾?

转载 作者:行者123 更新时间:2023-12-03 08:31:36 28 4
gpt4 key购买 nike

我有一个 Windows 文本文件,其中包含一行(以 CRLF 结尾)

aline

以下是几个命令的输出:

[root@panel ~]# grep aline file.txt
aline
[root@panel ~]# grep aline$'\r' file.txt

[root@panel ~]# grep aline$'\r'$'\n' file.txt

[root@panel ~]# grep aline$'\n' file.txt
aline

第一个命令的输出正常。我对第二个和第三个输出很好奇。为什么是空行?最后的输出,我认为它找不到该字符串,但它实际上找到了它,为什么?这些命令在 CentOS/bash 上运行。

最佳答案

在这种情况下,grep 确实匹配字符串“aline\r”,但您只是看不到它,因为它被 ANSI 序列覆盖 打印颜色。将输出传递给od -c,您就会看到

$ grep aline file.txtaline$ grep aline$'\r' file.txt$ grep aline$'\r' --color=never file.txtaline$ grep aline$'\r' --color=never file.txt | od -c0000000   a   l   i   n   e  \r  \n0000007$ grep aline$'\r' --color=always file.txt | od -c0000000 033   [   0   1   ;   3   1   m 033   [   K   a   l   i   n   e0000020  \r 033   [   m 033   [   K  \n0000030

使用--color=never,您可以看到输出字符串,因为grep不会打印出颜色。 \r 只是将光标重置到行的开头,然后打印出新行,不会覆盖任何内容。但默认情况下, grep 会检查它是否在终端上运行或其输出是否正在通过管道传输,并以颜色打印出匹配的字符串(如果支持),并且似乎重置颜色然后打印 \n 清除该行的其余部分

要匹配 \n,您可以使用 -z 选项将空字节设为行分隔符

$ grep -z aline$'\r'$'\n' --color=never file.txtaline$ grep -z aline$'\r'$'\n' --color=never file.txt  | od -c0000000   a   l   i   n   e  \r  \n  \00000010$ grep -z aline$'\r'$'\n' --color=always file.txt | od -c0000000 033   [   0   1   ;   3   1   m 033   [   K   a   l   i   n   e0000020  \r 033   [   m 033   [   K  \n  \00000031

您的最后一个命令 grep aline$'\n' file.txt 有效,因为 \n 只是一个 word separator在 bash 中,因此该命令与 grep aline file.txt 相同。在第 3rd 行中发生了完全相同的事情: grep aline$'\r'$'\n' file.txt 要传递换行符,您必须引用参数prevent word splitting

$ echo "aline" | grep -z "aline$(echo $'\n')"aline

为了演示第 3rd 行引用的效果,我在文件中添加了另一行

$ cat file.txtalineanother line$ grep -z "aline$(echo $'\n')" file.txt | od -c0000000   a   l   i   n   e  \r  \n   a   n   o   t   h   e   r       l0000020   i   n   e  \n  \00000025$ grep -z "aline$(echo $'\n')" file.txtalineanother line$

关于bash - grep 如何处理 DOS 行尾?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64915027/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com