在《文件打包与解压缩》一节实验中提到 Windows/dos 与 Linux/UNIX 文本文件一些特殊字符不一致。
如断行符 Windows 为 CR+LF(\r\n),Linux/UNIX 为 LF(\n)。使用 cat -A 文本 可以看到文本中包含的不可见特殊字符。Linux 的 \n 表现出来就是一个
,而
W
i
n
d
o
w
s
/
d
o
s
的表现
为
M
,而 Windows/dos 的表现为 ^M
,而Windows/dos的表现为M,可以直接使用 dos2unix 和 unix2dos 工具在两种格式之间进行转换,使用 file 命令可以查看文件的具体类型。
不过现在希望你在不使用上述两个转换工具的情况下,使用前面学过的命令手动完成 dos 文本格式到 UNIX 文本格式的转换。
-
使用
tr
命令进行转换:tr -d '\r' < input_dos.txt > output_unix.txt
tr
是一个用于字符替换或删除的命令,它的语法是tr [选项] 字符集1 字符集2
。在这里,我们使用了-d
选项来删除字符集1中的字符。'\r'
是一个表示回车符的特殊字符。在DOS文本中,每一行的结尾都是由回车符(CR,即\r
)和换行符(LF,即\n
)组成,而UNIX文本只使用换行符(\n
)。< input_dos.txt
表示将输入文件input_dos.txt
的内容重定向到tr
命令的标准输入。也就是说,tr
命令将从input_dos.txt
读取数据进行处理。> output_unix.txt
表示将tr
命令的标准输出重定向到文件output_unix.txt
,因此,处理后的结果将被写入output_unix.txt
。输出文件将具有UNIX文本格式,其中的回车符\r
被删除了。
-
使用
sed
命令进行转换:sed -e 's/\r$//' < input_dos.txt > output_unix.txt
sed
是一个用于处理文本流的流编辑器,它的基本工作原理是逐行读取输入文本,并根据提供的编辑指令进行处理。在这里,我们使用了替换指令。-e
选项表示在命令中提供编辑指令。's/\r$//'
是替换指令的格式。s
代表替换(substitute),\r$
表示匹配行尾的回车符\r
,而//
表示替换为空字符串,即删除匹配到的回车符。< input_dos.txt
表示将输入文件input_dos.txt
的内容重定向到sed
命令的标准输入。sed
命令将从input_dos.txt
读取数据进行处理。> output_unix.txt
表示将sed
命令的标准输出重定向到文件output_unix.txt
,因此,处理后的结果将被写入output_unix.txt
。输出文件将具有UNIX文本格式,其中的回车符\r
被替换为空字符串,即删除了。
无论使用tr
还是sed
,这两个命令都可以将DOS文本格式转换为UNIX文本格式,具体取决于您更习惯使用哪种命令。