Substituir espaços com sed e agrupamento regular não funcionando

0

Substitua caracteres vazios (espaço, tabulação, etc.) por não estarem funcionando com o agrupamento sed e regexp:

sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"

A linha inteira substitui uma string em um arquivo:

sudo find "${config_path}" -type f -exec sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

Alguma ideia de como consertar isso?

Obrigado!

EDIT1: Agora usando -r para ativar expressões regulares estendidas, mas ainda não substitui:

sudo find "${config_path}" -type f -exec sed -ir "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

Mas ainda não faz a substituição.

EDIT2 (SOLUÇÃO DE TRABALHO): Ao usar \ (\) para agrupamento, FUNCIONA:

sudo find "${config_path}" -type f -exec sed -i "s|dir\(\s*\)=\(\s*\)'${site_path_source}'|dir='${site_path_target}'|g" {} \;

Mas não entendo por que a solução EDIT1 com expressões regulares estendidas -r não está funcionando.

EDIT3 (SOLUÇÃO DE TRABALHO2): usando -r para ativar expressões regulares estendidas, AGORA FUNCIONA:

sudo find "${config_path}" -type f -exec sed -r -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g" {} \;

Explicação:

  • O uso de "sed -ir SUFFIX" está errado porque -i precisa de um sufixo.
  • O uso de "sed -r -i SUFFIX" é BOM porque -r e -i são usados separadamente e -i é seguido por um sufixo.
por klor 06.07.2017 / 21:40

1 resposta

2

O comando

sed -i "s|dir(\s*)=(\s*)'${site_path_source}'|dir$1=$2'${site_path_target}'|g"

procura por linhas que contenham d i r ( zero ou mais espaço ) = ( zero ou mais espaço ) ' etc. Se você está tentando usar Agrupamento você deve usar \( \) ou sed -r para ativar expressões regulares estendidas.

Observe que $1 e $2 são os dois primeiros parâmetros posicionais; Se você quiser o primeiro e o segundo grupo na string combinada, use e .

    
por 06.07.2017 / 23:05