如何以编程方式(不使用vi)将DOS/Windows换行符转换为Unix换行符?
dos2unix和unix2dos命令在某些系统上不可用。 如何使用sed、awk和tr等命令模拟它们?
如何以编程方式(不使用vi)将DOS/Windows换行符转换为Unix换行符?
dos2unix和unix2dos命令在某些系统上不可用。 如何使用sed、awk和tr等命令模拟它们?
当前回答
这是超级duper容易与PCRE;
作为脚本,或者用文件替换$@。
#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@
这将覆盖您的文件! 我建议只在备份时这样做(版本控制或其他方式)
其他回答
作为Jonathan Leffler的Unix to DOS解决方案的扩展,当你不确定文件当前的行结束符时,可以安全地转换为DOS:
sed '/^M$/! s/$/^M/'
这将在转换为CRLF之前检查该行是否已经在CRLF中结束。
这是超级duper容易与PCRE;
作为脚本,或者用文件替换$@。
#!/usr/bin/env bash
perl -pi -e 's/\r\n/\n/g' -- $@
这将覆盖您的文件! 我建议只在备份时这样做(版本控制或其他方式)
一个更简单的没有程序的AWK解决方案:
awk -v ORS='\r\n' '1' unix.txt > dos.txt
从技术上讲,“1”是您的程序,因为AWK在给定选项时需要一个。
或者,内部解决方案是:
while IFS= read -r line;
do printf '%s\n' "${line%$'\r'}";
done < dos.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
sed -i.bak --expression='s/\r\n/\n/g' <file_path>
因为问题中提到了sed,所以这是使用sed实现此目的的最直接的方法。该表达式表示仅用换行符替换所有换行符和换行符。这就是你从Windows到Unix所需要的。我验证过了。