为什么我的工具输出要覆盖自己,以及如何修复它?

为什么我的工具输出要覆盖自己,以及如何修复它?

这个问题的目的是为那些回答为“你有DOS行结尾”的日常问题提供一个答案,这样我们就可以简单地把它们作为这个问题的副本关闭,而不重复相同的答案。令人作呕.

注:这不是任何现存问题的复本。..这个问答的目的不仅是提供一个“运行这个工具”的答案,也是为了解释这个问题,这样我们就可以在这里指出任何有相关问题的人,他们会找到一个清晰的解释,解释为什么他们被指向这里,以及运行的工具,从而解决他们的问题。我花了几个小时阅读所有现有的问答,他们都缺乏对这个问题的解释,可以用来解决问题的替代工具,以及/或可能的解决方案的利弊/注意事项。另外,他们中的一些人已经接受了一些简单而危险的答案,不应该被使用。

现在回到典型问题这将导致在这里转介:

我有一个包含1行的文件:

what isgoingon

当我使用这个awk脚本打印它时,反转字段的顺序:

awk '{print $2, $1}' file

我没有看到预期的输出:

isgoingon what

我得到的字段应该在行的末尾,出现在行的开头,在行的开头覆盖一些文本:

 whatngon

或者我把输出分割成两行:

isgoingon
 what

问题是什么,我该如何解决?


白衣染霜花
浏览 447回答 3
3回答

斯蒂芬大帝

您可以使用\R&nbsp;速记字符类在……里面PCRE对于具有未知行尾的文件。对于Unicode或其他平台,还有更多的行要考虑。这个\RForm是Unicode财团推荐的字符类,用于表示泛型换行符的所有形式。因此,如果您有一个“额外的”,您可以找到并删除它的正则表达式。s/\R$/\n/是否将行尾的任何组合规范化为\n..或者,您可以使用s/\R/\n/g捕捉“行尾”的任何概念,并将其标准化为\n性格。给予:$&nbsp;printf&nbsp;"what\risgoingon\r\n"&nbsp;>&nbsp;file $&nbsp;od&nbsp;-c&nbsp;file0000000&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;h&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;\r&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;\r&nbsp;&nbsp;\n0000020Perl和Ruby以及大多数PCRE实现\R结合字符串断言的结尾$(多行模式的行尾):$&nbsp;perl&nbsp;-pe&nbsp;'s/\R$/\n/'&nbsp;file&nbsp;|&nbsp;od&nbsp;-c0000000&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;h&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;\r&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp; 0000017$&nbsp;ruby&nbsp;-pe&nbsp;'$_.sub!(/\R$/,"\n")'&nbsp;file&nbsp;|&nbsp;od&nbsp;-c0000000&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;h&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;\r&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp; 0000017(注意\r这两个词之间正确地保持单独)如果你没有\R您可以使用等效的(?>\r\n|\v)在PCRE。使用直接的POSIX工具,您的最佳选择可能是awk就像这样:$&nbsp;awk&nbsp;'{sub(/\r$/,"")}&nbsp;1'&nbsp;file&nbsp;|&nbsp;od&nbsp;-c0000000&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;h&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;\r&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp; 0000017一些有用的东西(但知道你的局限性):tr删除所有\r即使在另一个上下文中使用(允许使用\r是罕见的,而xml处理要求\r被删除,所以tr是一个很好的解决方案):$&nbsp;tr&nbsp;-d&nbsp;"\r"&nbsp;<&nbsp;file&nbsp;|&nbsp;od&nbsp;-c0000000&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;h&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000016GNUsed工程,但不是POSIXsed自\r和\x0D在POSIX上不支持。仅GNU sed:$&nbsp;sed&nbsp;'s/\x0D//'&nbsp;file&nbsp;|&nbsp;od&nbsp;-c&nbsp;&nbsp;&nbsp;#&nbsp;also&nbsp;sed&nbsp;'s/\r//'0000000&nbsp;&nbsp;&nbsp;&nbsp;w&nbsp;&nbsp;&nbsp;h&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;t&nbsp;&nbsp;\r&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;s&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;i&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;&nbsp;g&nbsp;&nbsp;&nbsp;o&nbsp;&nbsp;&nbsp;n&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp; 0000017这个Unicode正则表达式指南可能是什么是“新线”的最终治疗的最佳选择。

胡子哥哥

跑剂量2..虽然您可以用自己编写的代码来操作行尾,但是在Linux/Unix世界中已经有一些实用工具为您这样做了。如果在Fedora系统上dnf install dos2unix会把dos2unix工具就位(如果没有安装)。有一个类似的dos2unixDEB软件包可用于基于Debian的系统。从编程的角度来看,转换很简单。搜索文件中的所有字符以查找序列\r\n并将其替换为\n.这意味着有几十种方法可以使用几乎所有可以想象的工具从DOS转换到Unix。一个简单的方法是使用命令tr在这里你只需替换\r一无所有!tr&nbsp;-d&nbsp;'\r'&nbsp;<&nbsp;infile&nbsp;>&nbsp;outfile
打开App,查看更多内容
随时随地看视频慕课网APP