Substitui string muito longa em arquivos recursivamente

5

Eu tenho uma string muito longa e complexa em muitos arquivos e quero removê-la / substituí-la recursivamente. A string contém muitas barras, barras invertidas e espaços e qualquer tipo de sinalização especial. Como faço isso? Uma combinação simples de encontrar + sed não funcionaria por causa de todos os sinais especiais nos quais dificilmente posso escapar.

Seria possível gravar a string de pesquisa em um arquivo e usá-la como entrada para uma pesquisa & substituir comando?

    
por apparat 19.07.2014 / 00:42

2 respostas

5

Eu assumo que a string pode conter qualquer caractere, exceto newlines e null bytes. Você pode citar a string para usar como um padrão sed. Os caracteres $*./[\^ precisam ser precedidos por uma barra invertida. No texto de substituição, você precisa citar os caracteres \&/ .

regexp=$(printf %s "$old" | sed 's:[$*./\[^]:\&:g')
replacement=$(printf %s "$new" | sed 's:[\&/]:\&:g')
sed -e "s/$regexp/$replacement/g"

Se você tem o Perl disponível, é mais simples.

export old new
perl -pe 's/\Q$ENV{old}/$ENV{new}/'

Para atuar em todos os arquivos no diretório atual e em seus subdiretórios recursivamente:

regexp=$(printf %s "$old" | sed 's:[$*./\[^]:\&:g')
replacement=$(printf %s "$new" | sed 's:[\&/]:\&:g')
export regexp replacement
find . -type f -exec sh -c 'for x; do sed -e "s/$regexp/$replacement/g" <"$x" >"$x.new" && mv "$x.new" "$x"; done' _ {} +

ou

export old new
find . -type f -exec perl -i -pe 's/\Q$ENV{old}/$ENV{new}/' {} +
    
por 19.07.2014 / 01:16
0

Sim, você deve poder usar a opção -f para especificar um arquivo que contenha uma [lista de] expressão [s]

   -f script-file, --file=script-file

          add the contents of script-file to the commands to be executed

No entanto, você ainda precisará escapar de qualquer caractere especial (AFAIK não existe sed equivalente do --fixed-strings do grep) - se perl estiver disponível no seu sistema, você pode querer usar isso em vez disso, com \Q...\E modificadores de strings entre aspas.

    
por 19.07.2014 / 01:02