【问题标题】:Convert line endings [duplicate]转换行尾[重复]
【发布时间】:2013-05-22 01:12:45
【问题描述】:

我一直在使用d2u 来转换行尾。安装 Puppy Linux 后,我 注意到它没有附带d2u,而是dos2unix。然后我注意到 Ubuntu 默认情况下两者都缺失。

另一种转换行尾的方法是什么?

【问题讨论】:

    标签: bash shell sed command-line dos2unix


    【解决方案1】:

    一些选项:

    使用tr

    tr -d '\15\32' < windows.txt > unix.txt
    

    tr -d '\r' < windows.txt > unix.txt 
    

    使用perl

    perl -p -e 's/\r$//' < windows.txt > unix.txt
    

    使用sed

    sed 's/^M$//' windows.txt > unix.txt
    

    sed 's/\r$//' windows.txt > unix.txt
    

    要获得^M,您必须输入CTRL-V,然后输入CTRL-M

    【讨论】:

    • 在我的 Mac 上只有这个工作:tr -d '\r' &lt; windows.txt &gt; unix.txt
    • 我在 mac 上了解到你不能使用 tr 打开和写入同一个文件。这会导致一个空白文件,但写入不同的名称效果很好!
    • @Loren 我认为这应该是您对任何重定向的假设。目标文件在读取源文件之前打开。有些命令可以让你像sed-i 那样“就地”执行,但无论如何都要使用中间/备份文件
    • 这些答案通常是正确的,您可以添加 awk '{sub(/\r$/,"")}1' windows.txt &gt; unix.tx 但请注意,tr 正在从输入中删除 all \rs,而不仅仅是那些出现在每一行的末尾,就像 perl、sed 和现在的 awk 脚本一样。
    • 在同一行重定向标准输出和标准输入有点让我头疼,所以我使用了:cat windows_newlines.txt | tr -d '\r' &gt; unix_newlines.txt
    【解决方案2】:

    用 POSIX 做这件事很棘手:

    • POSIX Sed 不支持\r\15。即使这样做了,原地 选项 -i 不是 POSIX

    • POSIX Awk 确实支持\r\15,但是-i inplace 选项 不是POSIX

    • d2udos2unix 不是 POSIX utilities,但 ex

    • POSIX ex 不支持\r\15\n\12

    删除回车:

    awk 'BEGIN{RS="^$";ORS="";getline;gsub("\r","");print>ARGV[1]}' file
    

    添加回车:

    awk 'BEGIN{RS="^$";ORS="";getline;gsub("\n","\r&");print>ARGV[1]}' file
    

    【讨论】:

    • 那些 awk 脚本是 GNU awk 只是因为多字符 RS(RS 中超过 1 个字符会调用 POSIX 中未定义的行为,因此一些 POSIX awk 会默默地删除 $ 并仅保留 @ 987654338@,其他人可以为所欲为),当getline失败时会产生意想不到的结果,它们只会对输入的第一行进行操作,并且在某些情况下会破坏输入文件,如果他们是固定在所有行上操作会在读取输入文件时写入输入文件,从而导致其他人出现无限循环。不要执行这些脚本。
    • 这项工作在同一个文件上,即。它就地替换行尾。而tr 解决方案需要不同的文件作为输出。
    • sed 或 tr 不适合我。
    猜你喜欢
    • 2012-11-06
    • 2018-07-06
    • 2010-09-10
    • 1970-01-01
    • 2013-07-08
    • 2015-04-03
    • 1970-01-01
    相关资源
    最近更新 更多