同じ行に複数行の出力を印刷するにはどうすればよいですか?


回答:


13

を使用すると、指定されたセットから出現するすべての文字を削除できtr -dます。改行文字を削除するには:

tr -d '\n'

いつものように、入力および出力のリダイレクトとパイプを使用して、ファイルやその他のプロセスの読み取りまたは書き込みを行うことができます。

最後の改行を保持したい場合は、echoまたはprintf '\n'で簡単に追加し直すことができます。例:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt

10

たくさんの方法。説明のために、例をfile以下に保存しました。

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | perl -pe 's/\n//'
abcdefqwerty$ 

最後の改行文字も含めて、すべての改行文字が削除されます。あなたは代わりにしたいかもしれません:

$ printf "%s\n" "$(cat file | perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty

printf+ cat+ perlコンボはperl -pe 's/\n//;END{printf "\n"}' input.txt 、単一プロセスを介して、コマンドの置換や引用符を使用せずに、UUOCを介して処理する方がはるかに優れていると思います。おそらく。
セルギーKolodyazhnyy



2

これにPerlを使用する場合は、そのchomp機能を使用できます。

perl -pe chomp

興味のある方のために、もう少し詳しく説明します。

1つ以上のファイル名を後続の引数として渡すことができます。

perl -pe chomp file1 file2 file3

場合によってはそれをしたくないかもしれませんが、代わりにそのコマンドにパイプするかリダイレクトすることができます。(これらの機能-およびその警告-すべては、他のソリューションperl -pまたはperl -nベースのソリューションにも適用されます。)

したがって、実行からの出力を処理する場合some-command

some-command | perl -pe chomp

これは、terdonのanswerの Perlコマンドよりも潜在的に高速です。改行文字(で表される\n)は、この状況では行末にのみ表示されます。これは、Perlが各行の終了位置を決定するために使用しているためです。s/\n//行全体で改行を検索し、chomp最後の行を削除します(最後の行に行がある場合とない場合があります)。

パフォーマンスが実際に好む主な理由ではないかもしれませんchompterdonの答えperlコマンドは、非常に長い行を持つ巨大なファイルを処理していない限り、わずかに遅くなります。また、速度が必要な場合は、David Foersterの方法はおそらくより高速です。ただし、Perlを使用している場合、これはまさにこれに適したツールであり、の意図はの意図よりも明確だと思います。最終的に、どちらが優れているかについての客観的な答えはおそらくないでしょう。chompchomps/\n//

最終改行を印刷します。

ただし、$( )末尾の改行が確実に出力されるようにするために、コマンド置換()の使用はお勧めしません。処理中のテキストが短い場合を除き、すべてのテキストを一度に収集してから印刷する必要があるため、コマンドの理解が難しくなります。代わりに、あなたが行うことができますデビッド・フェルスターが示唆されているようにして実行するechoか、printf '\n'後で。

perl -pe chomp; echo

そのコマンドからパイピングしている場合(またはDavid Foersterが示しているように)リダイレクトている場合は{ ;}、両方のコマンドの出力が一緒になるように囲むことができます。端末に出力するだけの場合は、上記のとおりに実行できます。/ は実際には入力を読み取らないため、これはコマンドにパイピングまたはリダイレクトている場合でも機能します。つまり、これは動作します:echoprintf '\n'

some-command | perl -pe chomp; echo

ここでは、単に削除することはできません{ ;}

{ perl -pe chomp; echo; } | some-other-command

または、必要に応じてperl、最終的な改行自体を印刷することもできます。perlechoコマンドをで囲むように{ ;}、このアプローチはパイピングまたはリダイレクトている場合でも機能します(そして、すべてのアプローチと同様に、パイピングているときにも機能します):

perl -wpe 'chomp; END { print "\n" }'

terdonの答えのコマンドは、最終改行を印刷するこれらの方法でも正常に機能することに注意してください。例えば:

perl -pe 's/\n//'; echo
perl -pe 's/\n//; END { print "\n" }'

perl -wpe 'chomp; END { print "\n" } は同じプロセスですが、トレーリングエコーを追加するよりもわずかな利点があります
Sergiy Kolodyazhnyy


1

この回答には、作成しようとしている問題に対する解決策があります:なぜbashは$(catファイル)の\ nを削除するのですか?

入力cat myfile.txtすると、以下が表示されます。

abc
def
ghi

ただし、入力echo $(cat myfile.txt)すると次のように表示されます。

abc def ghi

このメソッドは、新しい改行があった場所にスペースを挿入することに注意してください。これにより、出力が読みやすくなりますが、質問の範囲に厳密に従うことはできません。


0

Bashを使用している場合、外部ツールなしで実行できます。

x=($(echo line1; echo line2))
echo "${x[@]}"

結果:

line1 line2

最初のコマンドは複数行の出力を配列に変換し、2番目のコマンドは配列を1行の複数の引数に展開します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.