CommentAppend() {
# Comment line and append line below commented line
local comment="$1" # search this line and comment it
local append="$2" # Append this line below commented line
local InputFile="$3"
sed -i "s/${comment}/#${comment}/g ; s/#${comment}/& \n${append}/" $InputFile
}
この関数はエスケープされていない文字に対してはうまく機能しますが、エスケープ文字を使用できる場合は失敗します。
では、エスケープ文字の関数を作成できますか?
答え1
次のことができます。
CommentAppend() {
# Comment line and append line below commented line
local comment="$1" # search this line and comment it
local append="$2" # Append this line below commented line
local InputFile="$3"
perl -pi -e "s/\Q${comment}\E/#${comment}\n${append}/g" "$InputFile"
}
Perl正規表現の区切り文字は、\Q...\E
それらの間のすべての内容が正規表現ではなくリテラル文字列として解釈されることを保証します(参考文献を参照perldoc perlre
)。
"$InputFile"
置換は1つのステップでのみ実行でき、単語の区切りを防ぐためにファイル名を引用符で囲む必要があります(例:)。これは、またはを使用してもsed
適用されますperl
。
答え2
agrsでsedを確認しましたが、うまくいか-E
なかったので、次の変更を使用しましたが、うまくいくようです。
CommentAppend() {
# Comment line and append line below commented line
local comment="$( echo "$1" | sed 's/\(\/\)/\\\//g' )" # search this line and comment it
local append="$( echo "$2" | sed 's/\(\/\)/\\\//g' )" # Append this line below commented line
local InputFile="$3"
sed -i "s/${comment}/#${comment}/g ; s/#${comment}/& \n${append}/" $InputFile
}
テスト
root@router:~# bash -x /tmp/test.sh
+ CommentAppend 'connection = sqlite:////var/lib/keystone/keystone.db' 'connection = mysql://keystoneUser:[email protected]/keystone' /tmp/test.conf
++ sed 's/\(\/\)/\\\//g'
++ echo 'connection = sqlite:////var/lib/keystone/keystone.db'
+ local 'comment=connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db'
++ sed 's/\(\/\)/\\\//g'
++ echo 'connection = mysql://keystoneUser:[email protected]/keystone'
+ local 'append=connection = mysql:\/\/keystoneUser:[email protected]\/keystone'
+ local InputFile=/tmp/test.conf
+ sed -i 's/connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db/#connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db/g ; s/#connection = sqlite:\/\/\/\/var\/lib\/keystone\/keystone.db/& \nconnection = mysql:\/\/keystoneUser:[email protected]\/keystone/' /tmp/test.conf