如何删除linux / unix中一行末尾的CRLF(\ r \ n)?

时间:2016-05-12 09:47:15

标签: linux bash unix awk sed

我用过

sed 's/\r\n$//' inputFile
然而,它没有奏效。我不知道为什么

我也试过

awk '{ printf "%s", $0 }' inputFile

但它只删除\ n但不删除\ r

如何在linux的一行末尾删除CRLF(\ r \ n)的特定组合?

P.S。

考虑到我的问题的具体情况,我认为这不是this的重复。我希望删除行末尾的CRLF(\ r \ n)。 tr无法正常工作,因为tr要删除的外观不一定在该行的末尾,并且管理员要求不安装dos2unix。在我的情况下sed 's/\r\n$//' inputFile无效,我几乎尝试了this中所有可能的解决方案。

顺便说一下,使用tr时,要移除的外观不一定在该行的末尾,而\r\n中的tr是一组\r\n。换句话说,它会删除\r中的\r位于该行的中间位置。

澄清:

我有一行输入。我希望\r\n完全删除。

7 个答案:

答案 0 :(得分:1)

完全不同的解决方案,只是为了好玩(但它有效)。假设您已安装xxd

xxd -ps -c 1 inputFile |
    awk 'BEGIN {prev=""} {if ($0=="0a" && prev=="0d") {prev="skip"} else { if (prev!="skip" && prev!="") {print prev} prev=$0 } } END {if (prev!="") {print prev}}' |
    xxd -r -ps

基本上它将文件转换为每个字符的2位十六进制,然后使用awk过滤它,寻找2个匹配的行(" 0d"" 0a&#34 ;,这是{{ 1}})连续跳过它们。

但实际上,我只是建议使用python或perl。其中一个应该已经在系统上。例如:

\r\n

答案 1 :(得分:0)

回答最后评论:只有一行......纯

read string <InputFile
echo -n "${string%$'\r'}"

说明:read将逐行读取,因此自然地删除换行符。然后${variable%$'\r'}将移除 1 尾随 CR

请查看help read有关这种方式的限制和选项:

printf ' foo\\x\r\t bar\r\n' > InputFile
IFS= read -r string <InputFile 
echo -n "${string%$'\r'}" | od -A n -t a -t c
      sp   f   o   o   \   x  cr  ht  sp   b   a   r
           f   o   o   \   x  \r  \t       b   a   r

(我使用-t c -t a,因为第二个是可读,但不要明确地显示空格。)

这也可以在常规下使用:

CR=`printf \\\r`
read string <InputFile
echo -n "${string%$CR}"

第一个答案:行尾行分隔符

要在行尾添加 CR ,请使用:

sed -e 's/\r$//'

在Unix的sed下,\n分隔 行,所以当你不使用N sed命令时可能永远不会在一行中找到\n

但是如果你想合并所有的行:

sed -ne ':;N;$!b;s/\r\n//g;p'

除了文件末尾之外,这将删除所有CRLF。 (您可以使用bash ${var%$'\r\n'}head -c -2

sed -ne ':;N;$!b;s/\r\n//g;p' | head -c -2

答案 2 :(得分:0)

Perl相当便携,并且能够很好地处理这个问题。

perl -pe 's/\r\n//' file

这将留下任何单独的\r\n,但如果它们按此特定顺序依次发生,则将其删除。

答案 3 :(得分:0)

您可以使用 GNU awk:

<强>之前:

0000000   S   i   n   g   o  \n   D   i   n   g   o  \n  \r   P   i   n
0000020   g   o  \r   M   i   n   g   l   o  \r  \n   S   i   n   g   l
0000040   i  \r  \n
0000043

<强>操作

$ awk 'BEGIN{RS="^$"}{printf "%s",gensub(/\r\n/,"","g")}' file1 > file2  && mv file2 file1

<强>后

$ od -tc file1
0000000   S   i   n   g   o  \n   D   i   n   g   o  \n  \r   P   i   n
0000020   g   o  \r   M   i   n   g   l   o   S   i   n   g   l   i
0000037

如果您希望将gensub(/\r\n/,"","g")替换为gensub(/\r\n/,"\n","g"),您可能希望将CRLF更改为LF

注意:

  1. 您不应该在awk中使用print,因为它会在最后生成LF。而是将printf与格式字符串一起使用。
  2. 我已经对@ ed-morton在评论#1 中提出的更改进行了编辑。此外,此评论还有一些可能有用的平台特定信息。

答案 4 :(得分:0)

如果它只有一行而且你知道最后肯定有\r\n,你可以使用head并删除最后2个字节:

head -c -2 inputFile

答案 5 :(得分:0)

我自己认为如果不熟悉perl或python,以下方法也很好

import Cocoa

class ThemedScrollView: NSScrollView {
    override func drawRect(dirtyRect: NSRect) {
        super.drawRect(dirtyRect)
    }
}

答案 6 :(得分:-2)

要从DOS行中取出unix行,只需删除回车符(CR)即可。 sed命令如下:

sed&#39; s / \ r // g&#39; inputfile&gt; OUTPUTFILE

试一试。