sedおよびregexpのグループ化でNULL文字(スペース、タブなど)の置換が機能しない理由:
sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"
行全体がファイルの文字列を置き換えます。
sudo find "${config_path}" -type f -exec sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;
問題を解決する方法をご存知ですか?
ありがとうございます!
EDIT1:-rを使用すると拡張正規表現が有効になりますが、それでも置き換えはできません。
sudo find "${config_path}" -type f -exec sed -ir "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;
しかし、まだ交換は発生しません。
編集2(作業ソリューション):グループ化に\(\)を使用すると、次のように動作します。
sudo find "${config_path}" -type f -exec sed -i "s|dir\(\s*\)=\(\s*\)'${site_path_source}'|dir\1=\2'${site_path_target}'|g" {} \;
しかし、 -r 拡張正規表現を使用する EDIT1 のソリューションが機能しない理由は理解できません。
編集3(タスクソリューション2):-rを使用して拡張正規表現を有効にすると、これが機能します。
sudo find "${config_path}" -type f -exec sed -r -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;
説明する:
- -i にはサフィックスが必要なので、「sed -ir SUFFIX」を使用するとエラーが発生します。
- -rと-iを別々に使用し、-iの後に接尾辞が付くので、「sed -r -i SUFFIX」を使用することをお勧めします。
答え1
注文する
sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"
d
i
r
(
ゼロ個以上のスペースを含む行を検索する)
=
(
0個以上のスペースなどのグループ)
'
化を使用する場合は、拡張正規表現を有効または有効にする\(
\)
必要があります。sed -r
$1
andは最初の2つの位置引数です。$2
文字列の最初のグループと2番目のグループを一致させるには、\1
andを使用する必要があります\2
。