
問題を回避せずに単純な「検索と置換」を実行できるbashソリューションはありますか?<!-- JavaScript -->
HTMLファイルを複雑なJavaScriptファイルの内容に置き換えようとしています。
頑張りました
JS=$(<"path to javascript file")
sed "s|<!-- JavaScript -->|${JS}|g" "path to html file" > "path to html file"
しかし、あなたが得る限り
sed: -e Ausdruck #1, Zeichen 16: Nicht beendeter `s'-Befehl
Powershellでは、
$CSS = Get-Content "path to javascript file"
(Get-Content "path to html file").replace('<!-- JavaScript -->', $JS) | Set-Content "path to html file" -Force
それは魅力のように動作し、問題から抜け出すことはできません。
アップデート(ただし、どちらも機能しません):
JS=$(<"${TemporaryPath}/${Project}/${Project}.js")
E='!'
sed "s|<${E}-- JavaScript -->|${JS}|g" "path to html file" > "path to html file"
わかりましたsed: -e Ausdruck #1, Zeichen 68: Nicht beendeter s'-Befehl
。 $ JSの内容を「foo」のような基本的な内容に変更すると機能します。 $ JSのJavaScriptの内容に問題があるのではないでしょうか? $ JSの内容を無関係にするにはどうすればよいですか?
答え1
問題はbashが感嘆符を解釈していることです。残念ながら、バックスラッシュでエスケープすることは機能しません。別の変数に入れるか、変数を二重引用符で囲んでいる間に一重引用符で囲むと、すべてがうまくいきます。 。 。
$ ARG="mytest"
$ echo "hello $ARG!"
bash: !": event not found
$ # didn't work
$ echo "hello $ARG\!"
hello mytest\!
$ # didn't work either!
$ echo "hello $ARG"'!'
hello mytest!
$ # that's better
$ E='!'
$ echo "hello $ARG$E"
hello mytest!
$ I like this one best.
答え2
二重引用符の代わりに一重引用符を使用してください。
[alexus@wcmisdlin02 Downloads]$ test="testing"
[alexus@wcmisdlin02 Downloads]$ echo "$test"
testing
[alexus@wcmisdlin02 Downloads]$ echo '$test'
$test
[alexus@wcmisdlin02 Downloads]$