bash-删除\ n每三行

时间:2014-10-09 05:54:15

标签: bash awk sed

如何从每三行删除换行符分隔符。 例如:

输入:

1
name
John
2
family 
Grady
3
Tel
123456

输出:

1
name John
2
family Grady
3
Tel 123456

7 个答案:

答案 0 :(得分:3)

这可能适合你(GNU sed):

sed 'n;N;s/\n//' file

用空格替换换行:

sed 'n:N;s/\n/ /' file

作为替代使用粘贴:

paste -sd'\n \n' file

答案 1 :(得分:2)

假设您要使用:(您的原始问题)加入下一个结尾的所有行:

1
name:
John
2
family: Grady
3
Tel:
123456

您可以使用sed来执行此操作:

sed ':a;/:$/{N;s/\n//;ba}'

a是分支标签。检测到模式:$(行尾的冒号),如果找到,N将下一行附加到当前行,则使用s/\n//替换命令删除它们之间的换行符,并使用a命令将其分支回标签ba


对于已编辑的问题,您只想将每个三线组的第二行和第三行合并而不管内容如何:

1
name
John
2
family 
Grady
3
Tel
123456

使用:

sed '{n;N;s/\n/ /}'

在该命令序列中,n将输出组中的第一行并将其替换为第二行。然后N会将第三行追加到第二行,s/\n/ /会将它们之间的换行符更改为空格,然后再输出合并后的两行。

然后它进入下一组三个并做同样的事情。


这两个命令都会为各自的输入生成所需的输出。

答案 2 :(得分:2)

awk 'NR%3==2{printf "%s ",$0;next}{print $0}' input.txt

输出:

1
name John
2
family Grady
3
Tel 123456

答案 3 :(得分:2)

您可以在Perl中执行此操作,

$ perl -pe 's/\n/ /g if $. % 3 == 2' file
1
name John
2
family Grady
3
Tel 123456

答案 4 :(得分:2)

使用AWK的一种方式:

awk '{ printf "%s%s", $0, (NR%3==2 ? FS : RS) }' file

答案 5 :(得分:0)

另一个解决方案,在Bash:

while read line
do
  if [[ $line = *: ]]
  then
    echo -n $line
  else
    echo $line
  fi
done < input.txt

答案 6 :(得分:0)

Unix方式:

$ paste -sd'\n \n' input

输出:

1
name John
2
family Grady
3
Tel 123456