web-dev-qa-db-ja.com

バックスラッシュの後に改行をbashでエコーする方法はありますか?

\で行を終了し、新しい行に何か他のものを入れようとしています。最初はこれを行いましたが、\ nを出力するだけです:

$ echo -e "Test\\\nNewline" 
Test\nNewline

この方法を試しましたが、円記号の後にスペースが追加されます。

$ echo -e "Test\\ \nNewline"
Test\ 
Newline

\の後にスペースがないようにするにはどうすればよいですか?

PDATE:スラッシュをさらに2つ追加すると、希望する結果が得られるので、問題はありません。しかし、私はまだそれがなぜそうするのか疑問に思っていますか?

$ echo -e "Test\\\\\nNewline"
Test\
Newline
3
InFlames

Bashリファレンスマニュアル:二重引用符 :二重引用符内で、これらの文字の1つが後に続く円記号[円記号を含む]が削除されます。

したがって、"Test\\\\\nNewline"echoコマンドにパラメーターとして渡される前に、Test\\nNewlineに置き換えられます。

これを実証するには:

$ echo -e "Test\\\\\nNewline"
Test\
Newline

$ echo -e 'Test\\\nNewline'
Test\
Newline
2
Steven

スティーブンは、なぜこれほど多くの円記号が必要なのかをすでに説明しています。同じことをするためのおそらくより良い方法をいくつか挙げたいと思います。まず、二重引用符の代わりに一重引用符を使用すると、エスケープの解釈/削除の余分なレベルがスキップされます。

$ echo -e "Test\\\nNewline"
Test\nNewline
$ echo -e 'Test\\\nNewline'
Test\
Newline

次に、このような場合はechoを使用しないことをお勧めします。これは、バージョンが異なれば動作もまったく異なるためです。\nがなくても、文字列内のエスケープシーケンス(-eなど)を解釈するものもあります。オプションを選択すると、出力の一部として「-e」などが出力される場合があります。bash組み込みバージョンの代わりに/ bin/echoを使用した例を次に示します。

$ /bin/echo -e 'Test\\\nNewline'
-e Test\\\nNewline

...それはOSXv10.10.4にあります。お使いのOSやバージョンによって異なる場合があります。エスケープの解釈や最終的な改行を省略して予測可能な動作が必要な場合は、printfではなくechoをお勧めします。もう少し複雑です。printfの最初の引数はフォーマット文字列であり、エスケープは常に解釈され、%シーケンスを含めることもできます。残りの引数を追加するために使用されます(エスケープシーケンスはnot解釈されます)。また、printfは最後に改行を自動的に追加しないため、明示的に含める必要があります。 printfを使用して必要なものを印刷する方法は次のとおりです。

$ printf 'Test\\\nNewline\n'    # note explicit final newline
Test\
Newline
$ printf '%s\n' 'Test\' 'Newline'    # Escape is interpreted in the format string, but not in the second argument
Test\
Newline
2
Gordon Davisson