cat -e file.txt
给出:
{"yellow":"mango"}^M$
^M$
{"yellow":"banana"}^M$
^M$
{"yellow":"blabla"}^M$
^M$
我只想拥有:
{""yellow":"mango"}^M$
{"yellow":"banana"}^M$
{"yellow":"blabla"}^M$
适用于文件夹中所有带有 txt 扩展名的文件。所以我尝试了:
find . -type f -name "*.txt" -print0 | xargs -0 sed -i "s/^M$^M$/^M$/g"
无济于事。有没有人有更好的主意?
head -n 3 file.txt | od -bc
产量:
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
这个:
awk 1 RS='\r\n' ORS= < file.txt
完全删除新行(所以这不好:我想在每行上保留连续两行之一,但它会做一些事情)。
您可以使用
sed -z 's/\r\n\r\n/\r\n/g'
.通常
sed
一次只能在一条线上工作。通过使用该-z
选项,sed
将处理以字节分隔的行,这些行0
通常不存在于文本文件中,因此整个文件将被视为一行并且可以替换换行符。(在stackoverflow上找到并添加了解释)
您还可以删除仅包含回车的行。
使用 GNU Sed:
对于最小但符合 POSIX 的机器(这里我们需要使用 Printf 生成回车):
^
匹配行首和最后一个$
行尾 (\n
)。例如:
如果可以删除所有空行,您可以执行以下操作:
如果你喜欢覆盖你的文件,你可以使用
-i
(就地)开关:上面的行会将原始文件复制为
*.bak
文件。如果您不关心备份,那么您可以省略该.bak
部分,如下所示:(你甚至可以使用通配符,所以
file1 file2 file3 ...
你可以写成file*
.)这种方法的优点是它可以一次更改所有文件(而不是必须为每个文件运行一次)。
但请记住:这只会保留至少包含一个非空白字符的行。因此,如果一行仅包含五个空格、一个制表符、一个回车和一个换行符,则不会保留该行。
我认为您可以使用 awk 的 Record Separator 和 Output Record Separator 来实现目标,这对于非常大的文件应该比
sed -z ...
.使用 Raku(以前称为 Perl6 的语言)
上面的示例仅打印包含非空白字符的行(
\S
匹配一个非空白字符)。下面是一个非常易读的版本:HTH。
https://raku.org
https://rakudo.org/downloads