2017-12-21 13 views
0

より大きいbashスクリプトでは、perlコマンドで行を使ってテキストファイルのタイムスタンプを現在の日付と時刻に置き換えます。その出力は、Perlコマンドはコマンドラインでは動作しますが、bashスクリプト内では動作しません

perlcmd="perl -i -pe 's/2005-03-31T19:13:30/$(date +"%Y-%m-%dT%H:%M:%S")/' ./file.txt" 
echo $perlcmd 
$perlcmd 

echoコマンドは、perlのコマンドが大丈夫であることを私に示しています:

perl -i -pe 's/2005-03-31T19:13:30/2017-12-21T11:33:44/' ./file.txt 

タイムスタンプは、しかし、置換されていない私は、次の行を使用します。エコーされた行をコマンド行に貼り付けると、正しく実行され、タイムスタンプが置き換えられます。それを動作させるために、bashスクリプトのコードを変更する必要がありますか?

+0

変数にhttp://mywiki.wooledge.org/BashFAQ/050をあなたのコマンドを入れて(そして、あなたはとにかくやる場合はいけない、[引用それを適切](https://で10067266/when-to-wrap-quotes-around-a-shell-variable))。 – tripleee

答えて

0

prelcmd変数に単一引用符をsyntacticaly文字通りなく解釈されるので(なぜならのbashに固有ではないシェルコマンドライン処理ではなくposix shell引用は、パラメータ展開の前にある)、最も簡単ではなく、アレイを使用することである。

perlcmd=(perl -i -pe 's/2005-03-31T19:13:30/'"$(date +"%Y-%m-%dT%H:%M:%S")"'/' ./file.txt) 
echo "${perlcmd[*]}" 
"${perlcmd[@]}" 

別の解決策は、コメントに続いてeval

perlcmd="perl -i -pe 's/2005-03-31T19:13:30/$(date +"%Y-%m-%dT%H:%M:%S")/' ./file.txt" 
echo "$perlcmd" 
eval "$perlcmd" 

を使用してperlcmd再解釈することです:$NewTitleはを含む任意の文字が含まれている可能性がある場合10、perlコードが壊れたり、コードを注入することができます。 ...この問題のデータは、データが正規表現パターンに使用することができ、メタ文字を含めることができる場合も、それは\Q引用符で囲むことができ、パラメータまたは環境によって渡すことができる\Eを避けるために:

perl -i -pe 'BEGIN{[email protected];[email protected]}s/\Q$old\E/$new/' "$old_title" "$new_title" ./file.txt 
:パラメータで

環境によって

old_title=$old_title new_title=$new_title perl -i -pe 's/\Q$ENV{old_title}\E/$ENV{new_title}/' ./file.txt 
+0

素晴らしい!変数に保存された文字列で文字列を置換したいのですか?変数NewTitleに目的の新しい文字列が含まれているとします。 perlcmd =(perl -i -pe 's/OldTitle/$ NewTitle /' ./file.txt)が動作しないので、他にどのような変更が必要ですか? – user7417

+0

一重引用符で囲まれているため、単一引用符を閉じるだけでダブルクォートし、ダブル・クローズ・ダブル・シングル/オールド・タイトル/ '' $ NewTitle ''/'を使用するとコードを生成するのが難しくなります。 –

関連する問題