2017-06-27 10 views
0

バックスラッシュと変数置換を含む複数行の文字列をきれいに作成しようとしています。もともと、私はバックスラッシュを必要と私はこのスニペットで必要なものを達成することができましたしませんでした:スラッシュで終わる行の複数行文字列

  description=$(cat <<EOF 
Creation time: $(date) 
Creator: $test_group_creator 
Test group: $test_group 
Test execution: $test_execution_id - $test_name 
Adapter: $initiator1_mac_addr 

http://... 
EOF 
) 

それは最後に少し不格好に見えると私は、コードのインデントレベルを壊す必要とすることが理想的ではないですが、それはかなり明確で、記述が後でWebページにどのように現れるかを表します。変数は、エコー出力(Iは< < -EOF構文を認識していますが、我々は、コードに4スペースのインデントを使用していて、その構文は、タブが必要です。)ここでされています

Creation time: Tue Jun 27 15:22:27 PDT 2017 
Creator: langlorx 
Test group: all 
Test execution: 13 - go 
Adapter: eth0 

link... 

はしかし、最近、テキストを持っていますWikiパーサにドロップされ、改行が1つのスペースに崩壊するようになりました。強制改行を途中段落に強制するには、行を二重のバックスラッシュで終了する必要があります。 bashがバックスラッシュを特別に扱っていることを知って、私はダブルバックスラッシュを二重にしなければならないことを知っていましたが、それでも正しいことはありませんでした。この使い方:

  description=$(cat <<EOF 
Creation time: $(date)\\\\ 
Creator: $test_group_creator\\\\ 
Test group: $test_group\\\\ 
Test execution: $test_execution_id - $test_name\\\\ 
Adapter: $initiator1_mac_addr\\\\ 

http://... 
EOF 
) 

私は改行が完全に結果の変数になくなっていることがわかり、そして最後に\\\\シーケンスは、空白行を持つ変数で単一のバックスラッシュで空白行の結果が完全になくなって前に。バックスラッシュがなければ、結果として得られる文字列は上に改行、空白行、および置換された変数で正確に出力されます。行の終わりにバックスラッシュを入れると、変数をエンコードするためのbashの異なる一連のルールがトリガーされます。

Creation time: Tue Jun 27 15:20:17 PDT 2017\\Creator: user\\Test group: all\\Test execution: 12 - go\\Adapter: eth0\link... 

まだ多少クリーンなコードを持ちながら猫とコマンド置換を悪用しようとするよりも、bashでこれを行うには良い方法はありますか?

答えて

1

必要なフォーマットでデータを保存し、必要に応じて後処理します。

embed() { sed -e 's/^ *//; s/$/\\\\/'; } 

description=$(embed << eof 
    Creation time: $(date) 
    Creator: foo 
    Test group: bar 
    etc 
eof 
) 

printf '%s\n' "$description" 

はあなたを与える:あなたは先頭のスペースを無視して、各行に\\を追加したい場合は、ちょうどそれを行う

Creation time: Tue Jun 27 15:33:31 PDT 2017\\ 
Creator: foo\\ 
Test group: bar\\ 
etc\\ 
関連する問題