同じ行に複数行の出力(単一出力)を印刷する方法はありますか?
たとえば、出力が次の場合:
abc
def
qwerty
印刷することは可能ですか?
abcdefqwerty
同じ行に複数行の出力(単一出力)を印刷する方法はありますか?
たとえば、出力が次の場合:
abc
def
qwerty
印刷することは可能ですか?
abcdefqwerty
回答:
を使用すると、指定されたセットから出現するすべての文字を削除できtr -d
ます。改行文字を削除するには:
tr -d '\n'
いつものように、入力および出力のリダイレクトとパイプを使用して、ファイルやその他のプロセスの読み取りまたは書き込みを行うことができます。
最後の改行を保持したい場合は、echo
またはprintf '\n'
で簡単に追加し直すことができます。例:
cat file1 file2... | { tr -d '\n'; echo; } > output.txt
複数行の出力をパイプすることができます 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 file1 file2 file3
場合によってはそれをしたくないかもしれませんが、代わりにそのコマンドにパイプするかリダイレクトすることができます。(これらの機能-およびその警告-すべては、他のソリューションperl -p
またはperl -n
ベースのソリューションにも適用されます。)
したがって、実行からの出力を処理する場合some-command
:
some-command | perl -pe chomp
これは、terdonのanswerの Perlコマンドよりも潜在的に高速です。改行文字(で表される\n
)は、この状況では行末にのみ表示されます。これは、Perlが各行の終了位置を決定するために使用しているためです。s/\n//
行全体で改行を検索し、chomp
最後の行を削除します(最後の行に行がある場合とない場合があります)。
パフォーマンスが実際に好む主な理由ではないかもしれませんchomp
。terdonの答えの perl
コマンドは、非常に長い行を持つ巨大なファイルを処理していない限り、わずかに遅くなります。また、速度が必要な場合は、David Foersterの方法はおそらくより高速です。ただし、Perlを使用している場合、これはまさにこれに適したツールであり、の意図はの意図よりも明確だと思います。最終的に、どちらが優れているかについての客観的な答えはおそらくないでしょう。chomp
chomp
s/\n//
ただし、$(
)
末尾の改行が確実に出力されるようにするために、コマンド置換()の使用はお勧めしません。処理中のテキストが短い場合を除き、すべてのテキストを一度に収集してから印刷する必要があるため、コマンドの理解が難しくなります。代わりに、あなたが行うことができますデビッド・フェルスターが示唆されているようにして実行するecho
か、printf '\n'
後で。
perl -pe chomp; echo
そのコマンドからパイピングしている場合(またはDavid Foersterが示しているように)リダイレクトしている場合は{
;}
、両方のコマンドの出力が一緒になるように囲むことができます。端末に出力するだけの場合は、上記のとおりに実行できます。/ は実際には入力を読み取らないため、これはコマンドにパイピングまたはリダイレクトしている場合でも機能します。つまり、これは動作します:echo
printf '\n'
some-command | perl -pe chomp; echo
ここでは、単に削除することはできません{
;}
:
{ perl -pe chomp; echo; } | some-other-command
または、必要に応じてperl
、最終的な改行自体を印刷することもできます。perl
やecho
コマンドをで囲むように{
;}
、このアプローチはパイピングまたはリダイレクトしている場合でも機能します(そして、すべてのアプローチと同様に、パイピングしているときにも機能します):
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" }
は同じプロセスですが、トレーリングエコーを追加するよりもわずかな利点があります
シェルのみの方法を使用:
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
このメソッドは、新しい改行があった場所にスペースを挿入することに注意してください。これにより、出力が読みやすくなりますが、質問の範囲に厳密に従うことはできません。
printf
+cat
+perl
コンボはperl -pe 's/\n//;END{printf "\n"}' input.txt
、単一プロセスを介して、コマンドの置換や引用符を使用せずに、UUOCを介して処理する方がはるかに優れていると思います。おそらく。