Jon*_*ler 311
您可以使用tr从DOS转换为Unix; 但是,如果CR仅作为CRLF字节对的第一个字节出现在文件中,则只能安全地执行此操作.通常就是这种情况.然后你使用:
tr -d '\015' <DOS-file >UNIX-file
Run Code Online (Sandbox Code Playgroud)
请注意,名称与名称DOS-file不同UNIX-file; 如果您尝试两次使用相同的名称,则最终文件中不会包含任何数据.
你不能反过来做(使用标准'tr').
如果你知道如何在一个脚本中输入回车符(control-V,control-M输入control-M),那么:
sed 's/^M$//' # DOS to Unix
sed 's/$/^M/' # Unix to DOS
Run Code Online (Sandbox Code Playgroud)
其中'^ M'是控制-M字符.您还可以使用bash ANSI-C Quoting机制指定回车:
sed $'s/\r$//' # DOS to Unix
sed $'s/$/\r/' # Unix to DOS
Run Code Online (Sandbox Code Playgroud)
但是,如果你将不得不这样做经常(一次以上,粗略地讲),这是更为明智的安装转换程序(例如dos2unix和unix2dos,或者是dtou和utod),并使用它们.
gho*_*g74 60
tr -d "\r" < file
Run Code Online (Sandbox Code Playgroud)
看看这里使用的例子sed:
# IN 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 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
Run Code Online (Sandbox Code Playgroud)
使用sed -i就地转化例如sed -i 's/..../' file.
小智 37
使用POSIX执行此操作非常棘手:
POSIX Sed不支持\r或\15.即使它确实如此,原位选项-i也不是POSIX
POSIX awk中不支持\r和\15,但是-i inplace选项不是POSIX
d2u和dos2unix不是POSIX实用程序,但ex是
POSIX前不支持\r,\15,\n或者\12
要删除回车:
ex -bsc '%!awk "{sub(/\r/,\"\")}1"' -cx file
Run Code Online (Sandbox Code Playgroud)
要添加回车:
ex -bsc '%!awk "{sub(/$/,\"\r\")}1"' -cx file
Run Code Online (Sandbox Code Playgroud)
cod*_*ict 24
使用AWK你可以做到:
awk '{ sub("\r$", ""); print }' dos.txt > unix.txt
Run Code Online (Sandbox Code Playgroud)
使用Perl你可以做到:
perl -pe 's/\r$//' < dos.txt > unix.txt
Run Code Online (Sandbox Code Playgroud)
Joh*_*ola 18
您可以使用选项-c {command}以编程方式使用vim:
Dos到Unix:
vim file.txt -c "set ff=unix" -c ":wq"
Run Code Online (Sandbox Code Playgroud)
Unix到dos:
vim file.txt -c "set ff=dos" -c ":wq"
Run Code Online (Sandbox Code Playgroud)
"set ff = unix/dos"表示将文件的fileformat(ff)更改为Unix/DOS行格式
":wq"表示将文件写入磁盘并退出编辑器(允许在循环中使用该命令)
Gor*_*son 15
到目前为止发布的解决方案只处理部分问题,将DOS/Windows的CRLF转换为Unix的LF; 他们缺少的部分是DOS使用CRLF作为行分隔符,而Unix使用LF作为行终止符.区别在于DOS文件(通常)在文件的最后一行之后没有任何内容,而Unix则会.要正确进行转换,您需要添加最终的LF(除非文件为零长度,即根本没有行).我最喜欢的咒语(有一点点添加逻辑来处理Mac风格的CR分离文件,而不是已经采用unix格式的最小文件)有点perl:
perl -pe 'if ( s/\r\n?/\n/g ) { $f=1 }; if ( $f || ! $m ) { s/([^\n])\z/$1\n/ }; $m=1' PCfile.txt
Run Code Online (Sandbox Code Playgroud)
请注意,这会将文件的Unixified版本发送到stdout.如果要使用Unixified版本替换该文件,请添加perl的-i标志.
ana*_*nik 13
如果您无权访问dos2unix,但可以阅读此页面,那么您可以从此处复制/粘贴dos2unix.py.
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
Run Code Online (Sandbox Code Playgroud)
从超级用户交叉发布.
Bor*_*ris 13
要就地转换文件
dos2unix <filename>
Run Code Online (Sandbox Code Playgroud)
要将转换后的文本输出到其他文件,请使用
dos2unix -n <input-file> <output-file>
Run Code Online (Sandbox Code Playgroud)
您可以使用
sudo apt install dos2unix
Run Code Online (Sandbox Code Playgroud)
或在MacOS上使用自制软件
brew install dos2unix
Run Code Online (Sandbox Code Playgroud)
使用PCRE轻松实现超级便携;
作为脚本,或替换$@为您的文件.
#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@
Run Code Online (Sandbox Code Playgroud)
这将覆盖您的文件!
我建议只使用备份(版本控制或其他)
一个更简单的awk解决方案,无需程序:
awk -v ORS='\r\n' '1' unix.txt > dos.txt
Run Code Online (Sandbox Code Playgroud)
技术上'1'是你的程序,b/c awk在给定选项时需要一个.
更新:在很长一段时间内第一次重新访问这个页面后,我意识到还没有人发布内部解决方案,所以这里有一个:
while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.txt > unix.txt
Run Code Online (Sandbox Code Playgroud)
小智 5
我只是想思考同样的问题(在 Windows 端,但同样适用于 Linux)。
\nzip -ll令人惊讶的是,没有人提到使用旧选项(Info-ZIP)对文本文件进行 CRLF\xc2\xa0<->\xc2\xa0LF 转换的非常自动化的方法:
zip -ll textfiles-lf.zip files-with-crlf-eol.*\nunzip textfiles-lf.zip\nRun Code Online (Sandbox Code Playgroud)\n注意:这将创建一个 ZIP 文件,保留原始文件名,但将行结尾转换为 LF。然后unzip将文件提取为压缩文件,即使用其原始名称(但以 LF 结尾),从而提示覆盖本地原始文件(如果有)。
相关摘录自zip --help:
zip --help\n...\n-l convert LF to CR LF (-ll CR LF to LF)\nRun Code Online (Sandbox Code Playgroud)\n
有趣的是,我在Windows上的git-bash中sed ""已经完成了窍门:
$ echo -e "abc\r" >tst.txt
$ file tst.txt
tst.txt: ASCII text, with CRLF line terminators
$ sed -i "" tst.txt
$ file tst.txt
tst.txt: ASCII text
Run Code Online (Sandbox Code Playgroud)
我的猜测是,sed在从输入中读取行时会忽略它们,并始终在输出中写入unix行尾。