2

私は何かをしようとしていますがbashsedそれは非常に難しいことがわかっています。

bash最初の引数として日付をとるスクリプトがあります。

コードは、渡された日付を含むようにテキストファイルの行を変更したいと考えています。これがコードです

#!/bin/bash

cq_fname="%let outputfile="/user/cq_"$1".csv";"

sed "29s/.*/\"$ct_fname\"/" file1.sas > file2.sas

このスクリプトは3行目で失敗し、文字化けしたコマンドについて何かがわかります。これを機能させるための賢い方法を知っている人はいますか?引用符でスラッシュを取得するにはどうすればよいsedですか?

4

4 に答える 4

6

の代わりに任意の文字を使用できるため、 :にない文字を/選択してください。$ct_fname

sed "29s|.*|\"$ct_fname\"|" file1.sas > file2.sas
于 2012-06-21T21:58:51.877 に答える
2

ここで強調表示されている構文は、問題が何であるかを示す良い指標になるはずです。複数の文字列が、文字列に含まれていないコンテンツと一緒にスマッシュされています。これを置き換えてみてください:

cq_fname="%let outputfile="/user/cq_"$1".csv";"

これとともに:

cq_fname="%let outputfile=\"/user/cq_$1.csv\";"

"文字列の内側を文字でエスケープし、ファイル名におそらく存在しないと思われる\文字を削除しました。"

Alokは、置換コマンドに別の文字を使用することを提案しています-それは必要です。

また、割り当てと文字列の両方で同じ変数名を使用する必要があります。(D'oh!)

最終的なスクリプトは次のとおりです。

#!/bin/bash
cq_fname="%let outputfile=\"/user/cq_$1.csv\";"
sed "29s|.*|$cq_fname|" file1.sas > file2.sas

set -xスクリプトの先頭に追加して、一致しない変数名を見つけました。途中でスクリプトの実行出力が表示されました。

壊れた:

$ ./replace 
+ cq_fname='%let outputfile="/user/cq_.csv";'
+ sed '29s|.*||' file1.sas

修理済み:

$ ./replace 
+ cq_fname='%let outputfile="/user/cq_.csv";'
+ sed '29s|.*|%let outputfile="/user/cq_.csv";|' file1.sas

set -x必要なときに、すばらしい小さなデバッグツールです。

于 2012-06-21T21:57:33.563 に答える
0

これはあなたのために働くかもしれません:

cq_fname='%let outputfile="/user/cq_.csv";'
sed '29c\'"$cq_fname" file1.sas > file2.sas
于 2012-06-22T05:24:18.050 に答える
0

他のすべての引用符セットでは、 "(二重引用符)の代わりに'(一重引用符)を使用します。

于 2012-06-21T21:56:53.823 に答える