同じ行に複数行の出力(単一出力)を印刷する方法はありますか?
たとえば、出力が次の場合:
abc
def
qwerty
印刷することは可能ですか:
abcdefqwerty
tr -d
を使用すると、指定されたセットから出現するすべての文字を削除できます。改行文字を削除するには:
tr -d '\n'
いつものように、入出力リダイレクトとパイプを使用して、ファイルや他のプロセスの読み取りまたは書き込みを行うことができます。
最後の改行を保持したい場合は、単にecho
またはprintf '\n'
を使用して元に戻すことができます。 g .:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
たくさんの方法。例として、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
awk
を介して複数行の出力をパイプできます
awk '{printf "%s",$0} END {print ""}'
またはsed
を使用します。
sed ':a;N;$!ba;s/\n//g'
$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'
1234
また、末尾の改行を保持するyour_command | paste -sd ''
。
このためにPerlを使用する場合は、chomp
関数を使用できます。
Perl -pe chomp
1つ以上のファイル名を後続の引数として渡すことができます。
Perl -pe chomp file1file2file3
場合によってはそれをしたくないかもしれません 、代わりにそのコマンドにパイプするかリダイレクトすることができます。 (これらの機能-およびその警告-すべては、他のPerl -p
またはPerl -n
ベースのソリューションにも適用されます。)
したがって、実行中の出力を処理する場合some-command
:
some-command | Perl -pe chomp
これは terdon's answer のPerlコマンドよりも潜在的に高速です。改行文字(\n
で表される)は、この状況では行末にのみ表示されます。これは、各行の終了位置を決定するためにPerlが使用しているためです。 s/\n//
は行全体で改行を検索しますが、chomp
は最後の行を削除します(最後の行に行がある場合とない場合があります)。
パフォーマンスがchomp
を好む主な理由ではないかもしれません。 terdon's answer のPerl
コマンドは、非常に長い行を持つ巨大なファイルを処理する場合を除き、わずかに遅くなります。また、速度が必要な場合は、 David Foersterの方法 のほうがおそらく高速です。ただし、Perlを使用している場合、chomp
はこれにぴったりのツールであり、chomp
の意図はs/\n//
の意図よりも明確だと思います。最終的に、どちらが良いかについての客観的な答えはおそらくないでしょう。
ただし、末尾の改行が確実に出力されるようにするために、コマンド置換($(
)
)の使用はお勧めしません。処理しているテキストが短い場合を除き、すべてのテキストを一度に収集してから印刷する必要があるため、コマンドが非常に遅くなる可能性が高く、コマンドが理解しにくくなります。代わりに David Foersterが提案したように を実行し、echo
またはprintf '\n'
を後で実行できます。
Perl -pe chomp; echo
fromまたは(David Foersterが示すように)そのコマンドをリダイレクトfromしている場合、それを{
;}
で囲むことができます両方のコマンドの出力が一緒に取得されるように。端末に印刷するだけの場合は、上記のとおりに実行できます。 echo
/printf '\n'
は実際には入力を読み取らないため、コマンドをパイピングまたはリダイレクトしている場合でも機能します。つまり、これは機能します:
some-command | Perl -pe chomp; echo
ここでは、単に{
;}
を削除することはできません。
{ Perl -pe chomp; echo; } | some-other-command
または、必要に応じて、Perl
に最終的な改行自体を出力させることもできます。 Perl
およびecho
コマンドを{
;}
で囲むように、このアプローチは、パイピングまたはリダイレクトfrom(および、likeallアプローチ、これはパイプtoでも機能します):
Perl -wpe 'chomp; END { print "\n" }'
Terdonの答えのコマンドは、最終改行を印刷するこれらの方法でも正常に機能することに注意してください。例えば:
Perl -pe 's/\n//'; echo
Perl -pe 's/\n//; END { print "\n" }'
シェルのみの方法を使用:
while IFS= read -r line || [ -n "$line" ]; do printf "%s" "$line"; done < inputfile.txt
この回答には、作成しようとしている問題に対する解決策があります: なぜbashは$(catファイル)の\ nを削除するのですか?
cat myfile.txt
と入力すると、以下が表示されます。
abc
def
ghi
ただし、echo $(cat myfile.txt)
と入力すると、次のように表示されます。
abc def ghi
このメソッドは、新しい改行があった場所にスペースを挿入することに注意してください。これにより、出力が読みやすくなりますが、質問の範囲に厳密に従っていません。
Bashを使用している場合は、外部ツールなしで実行できます。
x=($(echo line1; echo line2))
echo "${x[@]}"
結果:
line1 line2
最初のコマンドは複数行の出力を配列に変換し、2番目のコマンドは配列を1行の複数の引数に展開します。