Substituição avançada de texto

2

Como posso substituir um texto em todos os arquivos em todas as subpastas quando minha pesquisa inclui "*" Por exemplo, eu tenho muitos arquivos de texto contendo tal padrão (alguns caminhos errados que eu quero corrigir)

/folder1/(abc)/params.launch
/folder2/(efd)/gui.launch
/folder3/(ghi)/robot.launch

Agora quero adicionar / iniciar antes de cada arquivo ter esse resultado

/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

Eu pensei em pesquisar o padrão de string

  

")/*.launch"

mas como posso substituí-lo mantendo o conteúdo daqueles "*"

    
por Mehdi 07.05.2015 / 14:03

2 respostas

2

Deve ser bastante simples com sed :

sed 's;\([^/]*.launch$\);launch/;'
  • Você pode agrupar o texto correspondente cercando a expressão entre colchetes ( \( ... \) ). Você precisa escapar dos parênteses para que sed os veja como uma sintaxe especial.
  • Os grupos podem ser consultados usando a posição - o primeiro grupo é , o segundo é , etc.

Exemplo de saída:

$ sed 's;\([^/]*.launch\);launch/;' foo   
/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

Isso é para expressões regulares básicas. Para expressões regulares estendidas, pode-se usar sed -r , caso em que os parênteses não precisam ser escapados:

sed -r 's;([^/]*.launch);launch/;'

Por fim, em sed e algumas outras ferramentas, o texto correspondente completo pode ser chamado de & , evitando a necessidade de grupos e referências anteriores:

sed 's;[^/]*.launch;launch/&;' foo
    
por muru 07.05.2015 / 15:20
0

Usando bash :

#!/bin/bash
while IFS= read -r line; do
  ini="${line%/*}"
  last="${line##*/}"
  repl="${line##*.}"
      echo "${ini}/${repl}/${last}"
done <file.txt

Saída:

/folder1/(abc)/launch/params.launch
/folder2/(efd)/launch/gui.launch
/folder3/(ghi)/launch/robot.launch

Aqui, usamos a substituição de parâmetro de bash ter três variáveis:

  • A variável ini conterá a parte antes da última / , por exemplo /folder1/(abc)

  • A variável last conterá a parte depois da última / , por exemplo params.launch

  • A variável repl conterá o que deve ser colocado dentro das variáveis ini e last , ou seja, launch

Em seguida, imprimimos os valores das variáveis no padrão especificado, colocando / entre eles.

    
por heemayl 07.05.2015 / 15:26