我有需要替换的带有空格(包括换行符)的文本。我想用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 在最后一个命令中添加了一个。最简单
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)
这是一个纯粹的 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)