説明する:

説明する:

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

$1andは最初の2つの位置引数です。$2文字列の最初のグループと2番目のグループを一致させるには、\1andを使用する必要があります\2

関連情報