%20%E3%82%92%E3%82%A8%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%97%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
サーバー全体でいくつかのiptables変更を実行するスクリプトがあります。スクリプトには、文字列を見つけてその行の前にiptablesルールを挿入するsedコマンドがあります。
私が経験している問題は、私が編集しているファイルがyamlファイルで、その行に「and」がなければならないことです。
挿入されたコンテンツから 'を削除すると機能します。
$ sed 's/.*output_snat_lo.conf:.*/- -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1\n&/' file.yaml
- '-t nat -A POSTROUTING -s 192.168.1.25/32 -d 10.0.0.1 -j SNAT --to-source 172.1.1.1'
- -t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1
output_snat_lo.conf:
ただし、スラッシュを使用してエスケープするか二重引用符の中に入れると、スラッシュを含む二重引用符は印刷できませんが、代わりに無効なフラグを送信するオプションが提供されます。
これが私が挿入する内容です。
- '-t nat -A PREROUTING -d 192.168.1.1 -j DNAT --to-destination 10.0.0.1'\n&/' file.yaml
どのような提案/ヒントがありますか?前にもこんなことをしたことがあるようですが、どうしたのか覚えていません。
答え1
正規表現に入れたい一重引用符を閉じ、一重引用符をエスケープしてからもう一度開きます。
$ echo "a'b" | sed 's/'\''/X/'
aXb
$ echo "aXb" | sed 's/X/'\''/'
a'b
答え2
sedでは脱出する必要はありません。'
そこには特別な意味はありません。 bashでエスケープする必要があります。
$ sed -e "s/'/singlequote/g" <<<"'"
singlequote
ここでは、二重引用符はbashから一重引用符を保護しますが、sedはこれをうまく処理することがわかります。一重引用符を切り替えると、次のことが発生します。
$ sed -e 's/'/singlequote/g' <<<"'"
>
bourne(all?)のようなシェルの奇妙なこと'
は"
。'
二重引用符で囲むと、特別な意味はありません。観察する:
$ echo 'isn'"'"'t this hard?'
isn't this hard?
他の回答に示すように、バックスラッシュを使用してエスケープすることもできます。しかし、あなたは必ずしなければなりません。去る古い一重引用符ブロックが機能します。したがって、これは可能に見えますが、次のようになります。
echo '\''
'
最初の障害者文字の意味ではありません\
。
他のアプローチを取ることをお勧めします。sed
式はコマンドライン引数として指定できますが、シェルからエスケープする必要があります。短いsed式をエスケープするのは悪くありませんが、式がかなり長く、特殊文字がたくさん含まれています。
コマンドラインでコマンドを指定する代わりに、コマンドをファイルsed
に入れ、パラメータ呼び出しを使用してsed
コマンドファイルを指定します。-f
http://man7.org/linux/man-pages/man1/sed.1.htmlそれともman sed
詳しく紹介します。これにより、sed
コマンドはシェルが表示するものの一部ではなく(ファイル名のみが表示されます)、シェルエスケープジレンマが消えます。
$ cat t.sed
s/'*/singlequote(s)/g
$ sed -f t.sed <<<"' ' '''"
singlequote(s) singlequote(s) singlequote(s)