如何删除文件中的所有 CRLF(不替换为 LF)

如何删除文件中的所有 CRLF(不替换为 LF)

我想删除所有回车符后跟换行符(CRLF),例如\r\n在文件中。我怎样才能做到这一点?我无法使用,dos2unix因为它将 CRLF 替换为 LF。我不能使用,tr因为它也会替换任何\n前面没有\r.我怎样才能做到这一点?

答案1

sed ":a;/\r$/{N;s/\r\n//;b a}"

'\r'这将匹配末尾有(后跟 )的所有行'\n'。在这些行上,它将首先附加下一行输入(同时'\n在其间放置分隔符),然后用空字符串替换结果"\r\n",然后返回到开头查看模式空间的新内容是否不存在一次偶然的机会再次匹配。

按照评论:如果您还想'\r'从文件中删除任何其他内容,只需在删除 CRLF 组合后添加它:

sed ":a;/\r$/{$!N;s/\r\n//;t a};s/\r//g"

答案2

在做任何涉及操作行结尾的事情时,我倾向于使用perl俏皮话:

perl -pe 'BEGIN {undef $/} s/\r\n//g' *.txt

完成这项工作的关键是undef $/,它使 Perl 将每个文件作为一个字符串读取,然后您可以对其进行搜索和替换。\r要也裸露,只需调整正则表达式:

perl -pe 'BEGIN {undef $/} s/\r\n?//g' *.txt

相关内容