3

私はBashスクリプトを持っています:

var="
<Location /webdav/vendor1>
 DAV On
 AuthType Digest
 AuthName "rw"
 AuthUserFile /etc/password/digest-password
 Require user test123456
</Location>

<Location /webdav/limited/vendor1/demo>
 Dav On
 AuthType Digest
 AuthName "ro"
 AuthUserFile /etc/password/digest-password-test2
<LimitExcept GET HEAD OPTIONS PROPFIND>
deny from all 
</LimitExcept>
</Location>
"

sed -i -e "s/somestringX/${var}/g" change.txt

これはエラーを返します: sed: -e expression #1, char 9: unterminated `s' command

$var が /"'<> のような特殊記号のない 1 行または複数行の文字列の場合、すべて正常に動作します。

問題は $var の内容にあると思いますが、それを機能させるために何をすべきかわかりません。

これに対する解決策は何ですか?

4

3 に答える 3

7

Sed では、"s" コマンドの区切り文字として任意の文字を使用することもできます。基本的に、sed は「s」に続くものを区切り文字として使用します。したがって、コマンドを次のように変更できます。

sed -i -e "s_somestringX_${var}_g" change.txt

区切り文字がターゲット変数の一部でないことを確認する必要があります。

于 2013-10-09T22:58:20.250 に答える
2

すべてのスラッシュをエスケープされたスラッシュに置き換える必要があります\/。それはほとんどのテキストに当てはまります。ただし、テキストに が含まれている場合は&、それもエスケープします。バックスラッシュも同様にエスケープする必要があります。\\

テキストにアンパサンドやバックスラッシュが含まれていないように見えるため、次のようにする必要があります。

sed -i -e "s/somestringX/${var//\//\\\/}/g" change.txt

かなり複雑に思えますが、 に置き換えるだけ/です\/。Bash は でこれを行うことができますが、スラッシュ${string//substring/replacement}バックスラッシュをエスケープする必要があります。

于 2013-10-09T22:50:15.410 に答える
2

あなたは試すことができますawk

awk -v v="$var" '{gsub("somestringX",v); print}' change.txt > newfile.txt

ここでの唯一の違いは、オプションの場合のようにchange.txtファイルをその場で変更しないことです。結果をにリダイレクトしますsed-inewfile.txt

またはあなたが同じことをしたい場合sed -i

awk -v v="$var" '{gsub("somestringX",v); print}' change.txt > newfile.txt && mv newfile.txt change.txt
于 2013-10-09T23:59:21.297 に答える