如何以编程方式(不使用vi)将DOS/Windows换行符转换为Unix换行符?
dos2unix和unix2dos命令在某些系统上不可用。 如何使用sed、awk和tr等命令模拟它们?
如何以编程方式(不使用vi)将DOS/Windows换行符转换为Unix换行符?
dos2unix和unix2dos命令在某些系统上不可用。 如何使用sed、awk和tr等命令模拟它们?
当前回答
你可以通过option -c {command}以编程方式使用Vim:
DOS到Unix:
vim file.txt -c "set ff=unix" -c ":wq"
Unix到DOS:
vim file.txt -c "set ff=dos" -c ":wq"
“set ff=unix/dos”表示将文件的fileformat (ff)更改为unix/dos的行尾格式。
":wq"表示将文件写入磁盘并退出编辑器(允许在循环中使用该命令)。
其他回答
你可以使用tr从DOS转换到Unix;但是,只有当CR仅作为CRLF字节对的第一个字节出现在文件中时,才能安全地执行此操作。通常情况都是这样。然后使用:
tr -d '\015' <DOS-file >UNIX-file
注意DOS-file的名称不同于UNIX-file的名称;如果您尝试使用相同的名称两次,您将在文件中没有数据。
你不能反过来做(用标准的'tr')。
如果你知道如何在脚本中输入回车(control-V, control-M输入control-M),那么:
sed 's/^M$//' # DOS to Unix
sed 's/$/^M/' # Unix to DOS
其中'^M'是control-M字符。你也可以使用bash ANSI-C引用机制来指定回车:
sed $'s/\r$//' # DOS to Unix
sed $'s/$/\r/' # Unix to DOS
但是,如果您必须经常这样做(粗略地说,不止一次),那么安装转换程序(例如dos2unix和unix2dos,或者dou和utod)并使用它们会更明智。
如果你需要处理整个目录和子目录,你可以使用zip:
zip -r -ll zipfile.zip somedir/
unzip zipfile.zip
这将创建一个zip存档,其中行结束符从CRLF更改为cr。unzip将然后将转换后的文件放回原位(并逐个文件询问您-您可以回答:yes to all)。感谢@vmsnomad指出这一点。
Use:
tr -d "\r" < file
看一下使用sed的例子:
# In a Unix environment: convert DOS newlines (CR/LF) to Unix format.
sed 's/.$//' # Assumes that all lines end with CR/LF
sed 's/^M$//' # In Bash/tcsh, press Ctrl-V then Ctrl-M
sed 's/\x0D$//' # Works on ssed, gsed 3.02.80 or higher
# In a Unix environment: convert Unix newlines (LF) to DOS format.
sed "s/$/`echo -e \\\r`/" # Command line under ksh
sed 's/$'"/`echo \\\r`/" # Command line under bash
sed "s/$/`echo \\\r`/" # Command line under zsh
sed 's/$/\r/' # gsed 3.02.80 or higher
使用sed -i进行就地转换,例如sed -i 's/..../ '文件。
sed -i.bak --expression='s/\r\n/\n/g' <file_path>
因为问题中提到了sed,所以这是使用sed实现此目的的最直接的方法。该表达式表示仅用换行符替换所有换行符和换行符。这就是你从Windows到Unix所需要的。我验证过了。
你可以使用AWK。将记录分隔符(RS)设置为匹配所有可能的换行符的正则表达式。并将输出记录分隔符(ORS)设置为unix样式的换行符。
awk 'BEGIN{RS="\r|\n|\r\n|\n\r";ORS="\n"}{print}' windows_or_macos.txt > unix.txt
在Linux上,使用sed很容易将^M (Ctrl + M)转换为*nix换行符(^J)。
在CLI中就像这样,文本中会有一个换行符。然而,\将^J传递给sed:
sed 's/^M/\
/g' < ffmpeg.log > new.log
你可以使用^V (Ctrl + V), ^M (Ctrl + M)和\(反斜杠)当你输入:
sed 's/^V^M/\^V^J/g' < ffmpeg.log > new.log