为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

为什么我的工具输出要覆盖自己,以及如何修复它?这个问题的目的是为那些回答为“你有DOS行结尾”的日常问题提供一个答案,这样我们就可以简单地把它们作为这个问题的副本关闭,而不重复相同的答案。令人作呕.注:这不是任何现存问题的复本。..这个问答的目的不仅是提供一个“运行这个工具”的答案,也是为了解释这个问题,这样我们就可以在这里指出任何有相关问题的人,他们会找到一个清晰的解释,解释为什么他们被指向这里,以及运行的工具,从而解决他们的问题。我花了几个小时阅读所有现有的问答,他们都缺乏对这个问题的解释,可以用来解决问题的替代工具,以及/或可能的解决方案的利弊/注意事项。另外,他们中的一些人已经接受了一些简单而危险的答案,不应该被使用。现在回到典型问题这将导致在这里转介:我有一个包含1行的文件:what isgoingon当我使用这个awk脚本打印它时,反转字段的顺序:awk '{print $2, $1}' file我没有看到预期的输出:isgoingon what我得到的字段应该在行的末尾,出现在行的开头,在行的开头覆盖一些文本: whatngon或者我把输出分割成两行:isgoingon  what问题是什么,我该如何解决?
查看完整描述

3 回答

?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

您可以使用\R 速记字符类在……里面PCRE对于具有未知行尾的文件。对于Unicode或其他平台,还有更多的行要考虑。这个\RForm是Unicode财团推荐的字符类,用于表示泛型换行符的所有形式。

因此,如果您有一个“额外的”,您可以找到并删除它的正则表达式。s/\R$/\n/是否将行尾的任何组合规范化为\n..或者,您可以使用s/\R/\n/g捕捉“行尾”的任何概念,并将其标准化为\n性格。

给予:

$ printf "what\risgoingon\r\n" > file
$ od -c file0000000    w   h   a   t  \r   i   s   g   o   i   n   g   o   n  \r  \n0000020

Perl和Ruby以及大多数PCRE实现\R结合字符串断言的结尾$(多行模式的行尾):

$ perl -pe 's/\R$/\n/' file | od -c0000000    w   h   a   t  \r   i   s   g   o   i   n   g   o   n  \n    
0000017$ ruby -pe '$_.sub!(/\R$/,"\n")' file | od -c0000000    w   h   a   t  \r   i   s   g   o   i   n   g   o   n  \n    
0000017

(注意\r这两个词之间正确地保持单独)

如果你没有\R您可以使用等效的(?>\r\n|\v)在PCRE。

使用直接的POSIX工具,您的最佳选择可能是awk就像这样:

$ awk '{sub(/\r$/,"")} 1' file | od -c0000000    w   h   a   t  \r   i   s   g   o   i   n   g   o   n  \n    
0000017

一些有用的东西(但知道你的局限性):

tr删除所有\r即使在另一个上下文中使用(允许使用\r是罕见的,而xml处理要求\r被删除,所以tr是一个很好的解决方案):

$ tr -d "\r" < file | od -c0000000    w   h   a   t   i   s   g   o   i   n   g   o   n  \n        
0000016

GNUsed工程,但不是POSIXsed\r\x0D在POSIX上不支持。

仅GNU sed:

$ sed 's/\x0D//' file | od -c   # also sed 's/\r//'0000000    w   h   a   t  \r   i   s   g   o   i   n   g   o   n  \n    
0000017

这个Unicode正则表达式指南可能是什么是“新线”的最终治疗的最佳选择。


查看完整回答
反对 回复 2019-07-01
?
胡子哥哥

TA贡献1825条经验 获得超6个赞

剂量2..虽然您可以用自己编写的代码来操作行尾,但是在Linux/Unix世界中已经有一些实用工具为您这样做了。

如果在Fedora系统上dnf install dos2unix会把dos2unix工具就位(如果没有安装)。

有一个类似的dos2unixDEB软件包可用于基于Debian的系统。

从编程的角度来看,转换很简单。搜索文件中的所有字符以查找序列\r\n并将其替换为\n.

这意味着有几十种方法可以使用几乎所有可以想象的工具从DOS转换到Unix。一个简单的方法是使用命令tr在这里你只需替换\r一无所有!

tr -d '\r' < infile > outfile


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 408 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信