Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何查找windows行结束(EOL)字符_Linux_Unix_Sed_Eol_Dos2unix - Fatal编程技术网

Linux 如何查找windows行结束(EOL)字符

Linux 如何查找windows行结束(EOL)字符,linux,unix,sed,eol,dos2unix,Linux,Unix,Sed,Eol,Dos2unix,我有几百GB的数据需要使用Cygwin中的unix粘贴实用程序粘贴在一起,但是如果文件中有windows EOL字符,它将无法正常工作。数据可能有也可能没有windows EOL字符,如果不需要的话,我不想花时间运行dos2unix 所以我的问题是,在Cygwin中,我如何确定这些文件是否具有windows EOL CRLF字符 我尝试创建一些测试数据并运行 sed -r 's/\r\n//' testdata.txt 但无论是否已运行dos2unix,这似乎都是匹配的 谢谢。文件(1)实用程

我有几百GB的数据需要使用Cygwin中的unix粘贴实用程序粘贴在一起,但是如果文件中有windows EOL字符,它将无法正常工作。数据可能有也可能没有windows EOL字符,如果不需要的话,我不想花时间运行dos2unix

所以我的问题是,在Cygwin中,我如何确定这些文件是否具有windows EOL CRLF字符

我尝试创建一些测试数据并运行

sed -r 's/\r\n//' testdata.txt
但无论是否已运行dos2unix,这似乎都是匹配的

谢谢。

文件(1)实用程序知道区别:

$ file * | grep ASCII
2:                                       ASCII text
3:                                       ASCII English text
a:                                       ASCII C program text
blah:                                    ASCII Java program text
foo.js:                                  ASCII C++ program text
openssh_5.5p1-4ubuntu5.dsc:              ASCII text, with very long lines
windows:                                 ASCII text, with CRLF line terminators
文件(1)
已经过优化,可以尝试读取尽可能少的文件,因此您可能会幸运地大大减少查找和修复CRLF终端时需要执行的磁盘IO量


请注意,某些情况下的CRLF应保持原位:的捕获将使用CRLF。但这取决于你。:)

您可以使用
文件
查找:

file /mnt/c/BOOT.INI 
/mnt/c/BOOT.INI: ASCII text, with CRLF line terminators

CRLF是此处的有效值。

如果您希望退出代码与sed不同,则不会如此。它是否执行替换取决于匹配。除非有错误,否则退出代码将为true

但是,您可以从
grep
获得可用的退出代码

#!/bin/bash
for f in *
do
    if head -n 10 "$f" | grep -qs $'\r'
    then
        dos2unix "$f"
    fi
done

准备转换“#dos2unix”$i”时取消注释。

如上所述,“文件”解决方案有效。下面的代码片段可能会有所帮助

#!/bin/ksh
EOL_UNKNOWN="Unknown"       # Unknown EOL
EOL_MAC="Mac"               # File EOL Classic Apple Mac  (CR)
EOL_UNIX="Unix"             # File EOL UNIX               (LF)
EOL_WINDOWS="Windows"       # File EOL Windows            (CRLF)
SVN_PROPFILE="name-of-file" # Filename to check.
...

# Finds the EOL used in the requested File
# $1 Name of the file (requested filename)
# $r EOL_FILE set to enumerated EOL-values.
getEolFile() {
    EOL_FILE=$EOL_UNKNOWN

    # Check for EOL-windows
    EOL_CHECK=`file $1 | grep "ASCII text, with CRLF line terminators"`
    if [[ -n $EOL_CHECK ]] ; then
       EOL_FILE=$EOL_WINDOWS
       return
    fi

    # Check for Classic Mac EOL
    EOL_CHECK=`file $1 | grep "ASCII text, with CR line terminators"`
    if [[ -n $EOL_CHECK ]] ; then
       EOL_FILE=$EOL_MAC
       return
    fi

    # Check for Classic Mac EOL
    EOL_CHECK=`file $1 | grep "ASCII text"`
    if [[ -n $EOL_CHECK ]] ; then
       EOL_FILE=$EOL_UNIX
       return
    fi

    return
   } # getFileEOL   
   ...

   # Using this snippet
   getEolFile $SVN_PROPFILE
   echo "Found EOL: $EOL_FILE"
   exit -1

感谢您提供了使用file(1)命令的提示,不过它确实需要进一步完善。我遇到的情况不仅是纯文本文件,而且一些“.sh”脚本的eol错误。和“文件”报告如下,不考虑eol:

xxx/y/z.sh: application/x-shellscript
因此需要“file-e soft”选项(至少对于Linux):


这将在目录xxx和子目录中查找所有DOS eol文件。

grep recursive,带有文件模式过滤器

grep -Pnr --include=*file.sh '\r$' .
输出文件名、行号和行本身

./test/file.sh:2:here is windows line break

您可以使用dos2unix的-i选项来获取有关DOS Unix Mac换行符(按顺序)、bom和text/binary的信息,而无需转换文件

$ dos2unix -i *.txt
    6       0       0  no_bom    text    dos.txt
    0       6       0  no_bom    text    unix.txt
    0       0       6  no_bom    text    mac.txt
    6       6       6  no_bom    text    mixed.txt
   50       0       0  UTF-16LE  text    utf16le.txt
    0      50       0  no_bom    text    utf8unix.txt
   50       0       0  UTF-8     text    utf8dos.txt
使用“c”标志,dos2unix将报告要转换的文件,iow文件具有DOS换行符。要报告所有带有DOS换行符的txt文件,可以执行以下操作:

$ dos2unix -ic *.txt
dos.txt
mixed.txt
utf16le.txt
utf8dos.txt
要仅转换这些文件,只需执行以下操作:

dos2unix -ic *.txt | xargs dos2unix
如果需要对目录进行递归,请执行以下操作:

find -name '*.txt' | xargs dos2unix -ic | xargs dos2unix

另请参见dos2unix的手册页。

如果结果显示“ASCII文本,有很长的行,没有行终止符”会怎样?呵呵,一条没有任何行终止符的很长的行可能是
粘贴(1)
的一个笨拙输入,但可能
文件(1)
放弃得太快了?也许线比它检查的区域长。(快速浏览一下
文件
的源代码(
src/file.h
)看起来像是检查了256千字节(
有多少个
),所以听起来你的输入确实有很长的一行缺少行终止符。)
dos2unix -ic *.txt | xargs dos2unix
find -name '*.txt' | xargs dos2unix -ic | xargs dos2unix