我想在Linux上用grep搜索包含dos行结尾的文件.像这样的东西:
grep -IUr --color '\r\n' .
以上似乎与文字rn
相匹配,这不是所期望的.
这个输出将通过xargs传输到todos,将crlf转换为lf,就像这样
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
Thomee.. 146
grep可能不是你想要的工具.它将为每个文件中的每个匹配行打印一行.除非你想在10行文件上运行待机10次,否则grep并不是最好的方法.使用find在树中的每个文件上运行文件,然后通过"CRLF"的那个文件,将为每个具有dos样式行结尾的文件获取一行输出:
find . -not -type d -exec file "{}" ";" | grep CRLF
会得到你这样的东西:
./1/dos1.txt: ASCII text, with CRLF line terminators ./2/dos2.txt: ASCII text, with CRLF line terminators ./dos.txt: ASCII text, with CRLF line terminators
我最喜欢这个答案.我只是"找到了.-type f | xargs文件| grep CRLF`` (7认同)
不是一个好的解决方案,依赖于`file`程序的那种(无证件,面向人类消费)行为.这非常脆弱.对于(仅一个)示例:它不适用于XML文件,`file`报告`XML文档文本`,无论换行类型如何. (6认同)
grep的-l选项告诉它只列出文件(一次)而不是列出每个文件中的匹配项. (5认同)
pjz.. 112
使用Ctrl+ V,Ctrl+ M在grep字符串中输入文字回车符.所以:
grep -IUr --color "^M"
将起作用 - 如果^M
您按照我的建议输入了文字CR.
如果需要文件列表,还要添加该-l
选项.
说明
-I
忽略二进制文件
-U
阻止grep去除CR字符.默认情况下,如果它确定它是文本文件,它会这样做.
-r
以递归方式读取每个目录下的所有文件.
@akostadinov +1,但反引词被解释出你的评论;)换句话说,第二个选项是**grep $(printf'\ r')`**.但对于涉及bash的大多数实际用途,我会坚持使用`$'\ r'`. (4认同)
作为一个快速的黑客,但我认为人类的readbale解决方案将是:grep $'\ r'/ bash shell only /或grep`printf'\ r'` (3认同)
注意:选项`-U`仅与Windows(或cygwin)相关,但它在那里至关重要.在Windows上,没有它,该命令将无法运行. (3认同)
选项`-I`有什么意义?通过手册,在我看来,二进制文件被认为是不匹配的.不应该将`-I`和`-U`(强制执行二进制类型)的组合导致所有文件被视为不匹配? (3认同)
您提到了“ -l”标志作为附加选项,但是我认为应该将其包含在主要答案中,因为该问题实质上要求提供文件列表。此外,它还可以加快搜索速度。 (2认同)
小智.. 51
grep -IUlr $'\r'
explainhell.com - grep -IUlr
grep可能不是你想要的工具.它将为每个文件中的每个匹配行打印一行.除非你想在10行文件上运行待机10次,否则grep并不是最好的方法.使用find在树中的每个文件上运行文件,然后通过"CRLF"的那个文件,将为每个具有dos样式行结尾的文件获取一行输出:
find . -not -type d -exec file "{}" ";" | grep CRLF
会得到你这样的东西:
./1/dos1.txt: ASCII text, with CRLF line terminators ./2/dos2.txt: ASCII text, with CRLF line terminators ./dos.txt: ASCII text, with CRLF line terminators
使用Ctrl+ V,Ctrl+ M在grep字符串中输入文字回车符.所以:
grep -IUr --color "^M"
将起作用 - 如果^M
您按照我的建议输入了文字CR.
如果需要文件列表,还要添加该-l
选项.
说明
-I
忽略二进制文件
-U
阻止grep去除CR字符.默认情况下,如果它确定它是文本文件,它会这样做.
-r
以递归方式读取每个目录下的所有文件.
grep -IUlr $'\r'
explainhell.com - grep -IUlr
如果您的grep版本支持-P(--perl-regexp)选项,那么
grep -lUP '\r$'
可用于.
# list files containing dos line endings (CRLF) cr="$(printf "\r")" # alternative to ctrl-V ctrl-M grep -Ilsr "${cr}$" . grep -Ilsr $'\r$' . # yet another & even shorter alternative