シェル スクリプトでシンボルをエスケープするにはどうすればよいですか?

シェル スクリプトでシンボルをエスケープするにはどうすればよいですか?

シェルスクリプトを使用して他のファイルにテキストを書き込みたいのですechoが、データが意図したとおりの形式で書き込まれません

echo paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands.csv >> jobstext.sh

しかし、jobstext.shでは次のようなテキストが表示されます

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv,,,,,,,,,,,,,,

特殊記号をエスケープしようとしましたが、それでもデータは正確な形式ではありません。

誰かこれを手伝ってくれませんか?

paste B01_reprojected_subset_comma_updated.csv B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'>allbands1.csv

答え1

シェルがテキスト($および>や などの特殊文字を含む)に触れないようにするには*、すべてを一重引用符で囲みます。文字列に一重引用符を含めるには、引用符で囲んだ文字列を中断し、バックスラッシュでエスケープした一重引用符を追加する必要があります'here comes the embedded '\''quote'

echo 'paste B01_reprojected_subset_comma_updated.csv  B02_reprojected_subset_comma_updated.csv B03_reprojected_subset_comma_updated.csv B04_reprojected_subset_comma_updated.csv B05_reprojected_subset_comma_updated.csv B06_reprojected_subset_comma_updated.csv B07_reprojected_subset_comma_updated.csv B08_reprojected_subset_comma_updated.csv B8A_reprojected_subset_comma_updated.csv B09_reprojected_subset_comma_updated.csv B10_reprojected_subset_comma_updated.csv B11_reprojected_subset_comma_updated.csv B12_reprojected_subset_comma_updated.csv |awk -F",||\t" '\''{print  $1","$2","$3","$6","$9","$12","$15","$18","$21","$24","$27","$30","$33","$36","$39}'\''>allbands.csv' >> jobstext.sh

答え2

印刷を分割し、printfフォーマット文字列を使用して出力を調整すると簡単になります。まず、括弧の展開を利用した貼り付けコマンドです。

printf "%s " paste B{01..12}_reprojected_subset_comma_updated.csv >> jobstext.sh

次に、OFS を使用して簡略化された awk コマンドを示します。

printf "| %s '%s' %s %s '%s' > %s\n" awk -F',|\t' -v OFS=, '{print $1, $2, $3, $6, $9, $12, $15, $18, $21, $24, $27, $30, $33, $36, $39}' allbands1.csv >> jobstext.sh

%qに使用する書式文字列を簡略化するためにも使用できますprintf

答え3

ファイルのサンプルや、実行したい内容の明確な説明、または出力ファイルの希望する形式がなければ、これは単なる推測にすぎません。おそらく、jobstext.sh ファイルにコマンド ライン (paste stuff|awk action) を追加したいのでしょう。ネストされた引用符の問題を回避するには、エディターを使用して行う方がよいでしょう...

しかし、あなたの質問は特殊文字のエスケープについて尋ねているので、それに答える 1 つのオプションは、一重引用符を二重引用符で囲むことです。長いファイル名を B01 などに短縮すると、次のようになります。

echo 'paste B01 B02 B03 B04 B05 B06 B07 B08 B8A B09 B10 B11 B12 |
awk -F",||\t" '"'"'{print "$1","$2","$3","$6","$9","$12","$15","$18","$21",
"$24","$27","$30","$33","$36","$39}'"'"' >allbands.csv' >> jobstext.sh

最初の一重引用符は、貼り付けコマンド、ファイル名、パイプ、awk、および F オプションを含む文字列を開始します。次に、シーケンスの最初の一重引用符で'"'"'文字列が閉じられ、次の 3 文字で別の一重引用符の文字列が定義され、最後の文字は 3 番目の文字列 (中括弧で囲まれた awk アクションを含む) を開始する一重引用符です。同様の 5 つの引用符シーケンスでその文字列が閉じられ、別の一重引用符が挿入され、5 番目の文字列 (出力を allbands.csv にリダイレクトする文字列) が開始されます。最後に、その文字列が閉じられ (行の最後の引用符で)、5 つの文字列すべてが連結されて jobstext.sh に追加されます。

これは面倒ですが、1 つのコマンド ラインで 2 レベルの単一引用符を使用しようとすると、このような結果になります。単一引用符は、awk ステートメントがシェルによって解釈されるのを防ぐために必要です。

改善策としては、1/ 拡張可能なファイル名を使用する*(ただし、「B8A」は単純なファイル名の拡張を妨げる不整合を導入します)、2/ コマンドを jobstext.sh に編集して簡略化することです。@muru の回答の提案は取り入れる価値があります (ただし、「B8A」ファイルには注意してください)。

関連情報