如何用 sed 替换换行符?

Bas*_*sil 5 sed newlines

我有需要替换的带有空格(包括换行符)的文本。我想用sed,但AIX似乎并不支持答案sed,我发现换行的问题。我使用的 bash 版本是“GNU bash,版本 3.00.16(1)-release (powerpc-ibm-aix5.1)”

如果我运行一个命令输出一堆文本行,如:

alias:  aliasname
                10:00:00:00:00:00:00:00
Run Code Online (Sandbox Code Playgroud)

使每行一行的最佳方法是什么?如果我使用ssh user@system command | tr '\n' ' ',它会替换两个换行符,我需要保留最后一个,否则输出会变成一行。

编辑:到目前为止我尝试过的是:

  • | sed -e ':1' -e 'N' -e '$!b1' -e 's/\n/ /g' 它替换所有换行符,将整个输出流放入一行。
  • | while read i; do printf "%s " $i; done; echo 这也替换了所有换行符
  • | tr -d '\n'and | tr -d '\n'; echo,它仍然替换所有换行符,但是 echo 在最后一个命令中添加了一个。

Cos*_*tas 5

最简单

ssh user@system command | tr '\n' ' ';echo
Run Code Online (Sandbox Code Playgroud)

或者如果你想要 sed

ssh user@system command | sed 'N;s/\n\s\+/ /'
Run Code Online (Sandbox Code Playgroud)


ter*_*don 4

这是一个纯粹的 bash 方法,它将删除每对中的第一个换行符:

command | 
  while IFS=$'\n' read i; do 
    let c++; [ "$(expr $c % 2)" -eq "0" ] && echo "$i" || printf "%s " "$i"; 
  done
Run Code Online (Sandbox Code Playgroud)

如果您不需要保持空格不变,则可以省略IFS

command | 
  while read i; do 
    let c++; [ "$(expr $c % 2)" -eq "0" ] && echo "$i" || printf "%s " "$i"; 
  done
Run Code Online (Sandbox Code Playgroud)

同样的想法使用perl

command | perl -ne 'chomp;$. % 2 == 0 ? print "$_\n" : print "$_"' 
Run Code Online (Sandbox Code Playgroud)