在bash中的特定行中删除换行符(将两行合并为一行)

时间:2013-01-11 15:39:04

标签: linux bash sed

我有一个来自第三方系统的文件,我需要纠正一点。即将到来的文件中包含数据中间的新行字符。让我们说我能够找到这条损坏的线路。我需要做的只是删除新的行字符并将行与上面的行连接(这将在我删除新的行字符时发生)。 这是一个例子:

data_1 data_2 data_3 data_4 data_5
data_1 data_2 data_3 data_4 data_5
data_1 data_2 
 data_3 data_4 data_5
data_1 data_2 data_3 data_4 data_5
data_1 data_2 data_3 data_4 data_5
data_1 data_2 data_3 data_4 data_5

正如您所看到的,第3行是错误的,需要通过删除换行符来修复/连接第4行。 我有一个简单的脚本,可以找到'错误'(太短)的行。 问题是:如何从特定行中删除新行字符(我的行号错误)。

我尝试使用sed(sed ':a;N;$!ba;3s/\n/ /' data.log),其中s之前的3是一个行号,但它不起作用。

...或者可能有更好的解决方案来解决这个问题。请帮忙。

3 个答案:

答案 0 :(得分:3)

你可以使用sed,利用新行开头的空间

sed -e '{
N
s/\n //
}' data.log

这不要求您提前知道虚假换行的位置,但只会纠正一次中断(如果该行被拆分为3则不起作用)

答案 1 :(得分:2)

  

如何从特定行中删除新行字符(我有一个   错误的行号)

如果您已找出目标行号,那么使用awk可以执行此操作:

awk -v N=3 '{if (NR==N) l=$0; else if (NR==N+1) print l $0; else print}' infile

答案 2 :(得分:2)

这不是你要求的,但它会自动找到损坏的行并修复它们。只需设置col参数

,即可设置所需的列数
awk -v col=5 '
           { 
               if ((cur + NF) < col) 
               { 
                   printf($0); 
                   cur=cur+NF; 
               } 
               else 
               { 
                   print $0; 
                   cur=0; 
               } 
           }' your_file