Answers:
有几个专用程序,包括
只需选择适当方向的工具,然后在命令行中传递要转换的文件名即可。
如果您都没有,但是有Linux或Cygwin:
sed -i -e 's/\r\+$//' filename # dos|unix -> unix
sed -i -e 's/\r*$/\r/' filename # dos|unix -> dos
如果您有perl:
perl -i -pe 's/\r+$//' filename # dos|unix -> unix
perl -i -pe 's/\r*$/\r/' filename # dos|unix -> dos
仅使用POSIX工具(包括BusyBox),要从unix转换为dos,您将需要在sed命令中原样传递CR字符。
cr=$(echo | tr '\n' '\r')
sed -e "s/$cr*\$/$cr/" <filename >filename.dos
mv filename.dos filename
另一方面,您可以简单地删除所有CR:
tr -d '\r' <filename >filename.dos
mv filename.dos filename
您可以使用通配符一次转换同一目录中的许多文件,例如
sed -i -e 's/\r\+$//' *.txt
要转换当前目录及其子目录中的所有文件,如果您的外壳为zsh,则可以使用**/
,例如
sed -i -e 's/\r\+$//' **/*.txt
您可以**/
在≥4的bash 中使用,但您需要先运行shopt -s globstar
(可以在中放入此行~/.bashrc
)。您可以**/
在ksh93 中使用,但需要先运行set -o globstar
(可以将此行放入~/.kshrc
。
如果只能使用需要重定向的工具,请使用for
循环。
for x in *.txt; do
tr -d '\r' <"$x" >"$x.dos"
mv -- "$x.dos" "$x"
done
如果没有**/
或需要更复杂的匹配来选择要转换的文件,请使用find
命令。这是一个Linux / Cygwin示例,该示例以递归方式转换当前目录及其子目录下的所有文件,但称为.o
和的子目录下的文件除外bin
。
find -name 'bin' -type d -prune -o \
\! -name '*.o' \
-exec sed -i -e 's/\r\+$//' {} +
这是一个POSIX示例。我们告诉find
启动一个可以执行必要重定向的外壳程序。
find -name 'bin' -type d -prune -o \
\! -name '*.o' \
-exec sh -c '
tr -d '\r' <"$0" >"$0.dos"
mv -- "$0.dos" "$0"
' {} \;
find
通过在shell命令中使用循环,可以使方法稍快一些,但代价是要编写更复杂的代码。
find -name 'bin' -type d -prune -o \
\! -name '*.o' \
-exec sh -c '
for x; do
tr -d '\r' <"$x" >"$x.dos"
mv -- "$x.dos" "$x"
done
' _ {} +