改行文字をsedに置き換える方法は? [コピー]

改行文字をsedに置き換える方法は? [コピー]

置き換えるスペース(改行を含む)を含むテキストがあります。使いたいのですが、sedAIXではサポートしていないようです。回答私が見つけたsed改行の問題。私が使用しているbashのバージョンは「GNU bash、バージョン3.00.16(1)-release(powerpc-ibm-aix5.1)」です。

たとえば、複数行のテキストを出力するコマンドを実行すると、次のようになります。

alias:  aliasname
                10:00:00:00:00:00:00:00

1行に1行ずつ作成する最良の方法は何ですか?を使用すると、ssh user@system command | tr '\n' ' '2つの改行文字が置き換えられ、最後の改行文字は維持する必要があります。それ以外の場合、出力は1行になります。

編集:これまで私が試したことは次のとおりです。

  • | sed -e ':1' -e 'N' -e '$!b1' -e 's/\n/ /g'すべての改行を置き換えて、出力ストリーム全体を1行に入れます。
  • | while read i; do printf "%s " $i; done; echoこれはまた、すべての改行文字を置き換えます。
  • | tr -d '\n'そして| tr -d '\n'; echo、まだすべての改行を置き換えますが、最後のコマンドにエコーを追加します。

答え1

最も簡単

ssh user@system command | tr '\n' ' ';echo

またはあなたが望むならsed

ssh user@system command | sed 'N;s/\n\s\+/ /'

答え2

以下は、各ペアの最初の改行文字を削除する純粋なbashメソッドです。

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

スペースをそのまま残す必要がない場合は、スペースを省略できますIFS

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

同じアイデアは以下を使用しますperl

command | perl -ne 'chomp;$. % 2 == 0 ? print "$_\n" : print "$_"' 

答え3

この試み:

sed -e ':1' -e 'N' -e '$!b1' -e 's/\n/ /g'

答え4

これを行うには;を使用するのが最善ですsed。バラよりシェルループを使用してテキストを処理するのはなぜ悪い習慣と見なされますか?  たとえば、この小さな変更はコスタスの2番目のsed答え():

sed 'N; s/\n/ /'

質問に対する良い答え: N次の入力行をパターンスペースに追加してからs/\n/ /交換を実行します。 (その後、2行の入力ごとにこのコマンドを繰り返します。)

ただし、これをシェルで完全に実行するには、このバリエーションを使用してください。テドンの答え:

while IFS= read -r line1
do
    IFS= read -r line2; printf '%s %s\n' "$line1" "$line2"
done

動作するために外部プログラムを実行する必要はありません。ロジックは(IMHO)シンプルです。入力は終了しませんが、1行を読み、もう1行を読み、スペースで区切られた2つの文字列を1行に出力します。

上記のコードには極端な場合に問題があります。入力が偶数の正しい形式の行と改行で終わらない一部の文字が続く場合は、行の最後(一部)を削除します。 (テドンの答え同じ問題がありましたが、行だけではありません。 )これは、readデータを変数に入れても行の一部を読み取ると失敗を返すからです。したがって、修正は次のようになります。

while IFS= read -r line1  ||  [ "$line1" != "" ]
do
    IFS= read -r line2; printf '%s %s\n' "$line1" "$line2"
done

read失敗するまで続けるそして変数を空の文字列に設定します。

関連情報