用一个替换两个连续的 CR

use*_*413 5 command-line text-processing

cat -e file.txt 给出:

{"yellow":"mango"}^M$
^M$
{"yellow":"banana"}^M$
^M$
{"yellow":"blabla"}^M$
^M$
Run Code Online (Sandbox Code Playgroud)

我只想拥有:

{""yellow":"mango"}^M$
{"yellow":"banana"}^M$
{"yellow":"blabla"}^M$
Run Code Online (Sandbox Code Playgroud)

适用于文件夹中带有 txt 扩展名的所有文件。所以我试过:

find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/^M$^M$/^M$/g"
Run Code Online (Sandbox Code Playgroud)

无济于事。有没有人有更好的主意?

head -n 3 file.txt | od -bc
Run Code Online (Sandbox Code Playgroud)

产量:

0000000 173 042 171 145 154 154 157 167 042 072 042 155 141 156 147 157
          {   "   y   e   l   l   o   w   "   :   "   m   a   n   g   o
0000020 042 175 015 012 015 012 173 042 142 141 142 141 142 042 072 042
          "   }  \r  \n  \r  \n   {   "   b   a   b   a   b   "   :   "
0000040 155 141 156 147 157 042 175 015 012
          m   a   n   g   o   "   }  \r  \n
0000051
Run Code Online (Sandbox Code Playgroud)

这个:

awk 1 RS='\r\n' ORS= < file.txt
Run Code Online (Sandbox Code Playgroud)

完全删除新行(所以这不好:我想在每行上保留两个连续的行之一,但它做了一些事情)。

小智 13

您可以使用sed -z 's/\r\n\r\n/\r\n/g'.

通常一次sed只能在一行上工作。通过使用该-z选项,sed将处理由0字节分隔的行,这些行通常不存在于文本文件中,因此整个文件将被视为一行并且可以替换换行符。

(在stackoverflow上找到并添加了解释)

  • 不要在多 GB 文件上尝试此操作。 (4认同)

Qua*_*odo 12

您还可以删除仅包含回车符的行。

^匹配行首和最后一个$,即行尾 ( \n)。

例如:

$ cat -e file
AB^M$
^M$
CB^M$
^M$
$ sed '/^\r$/d' file|cat -e
AB^M$
CB^M$
Run Code Online (Sandbox Code Playgroud)