Padrão de Regex e Substituir linha por substituição

0

Para um processo de migração, eu preciso fazer alguma substituição no meu script bash.

Então, nos meus arquivos .txt, eu tenho essas referências, por exemplo:

[[File:My Image.png|400px|thumb|center|My Image]]
[[File:My Image.png|400px|thumb|center]]
[[File:My Image.png|400px|thumb]]
[[File:My Image.png|400px]]
[[File:My Image.png]]

O que eu preciso fazer é substituir todas essas ocorrências por essa linha (somente - portanto, sem mais tamanho, descrição ou outras informações):

[[File:My Image.png]]

Então, eu tentei fazer um é construir um regex PCRE para extrair todos os nomes de imagens com:

/File:(.*\..{3})/g

Eu criei este comando final para encontrar todas as ocorrências em meus arquivos .txt e extrair o nome da imagem com meu regex:

find . -name "*.txt" | xargs perl -i -p -e 's/File:(.*\..{3})/$1/g'

Mas eu encontrei alguns problemas como:

  • Um erro:

xargs: unterminated quote

  • E, finalmente, não sei como usar o nome da imagem extraída para substituir todas as ocorrências (linhas completas)

PS: estou no sistema MacOS e uso o bash v4

    
por Sébastien Robert 04.04.2018 / 12:10

2 respostas

0

Tente

find . -name '*.txt' -exec perl -i -pe 's/File:[^|]+\K\|[^]]+//g' {} \;
  • File:[^|]+ correspondência File: seguido por não | caracteres
  • \K para que não tenhamos que capturar a string anterior e colocá-la de volta na seção de substituição
  • \|[^]]+ match | seguido por não ] caracteres a serem excluídos
  • Também pode usar sed -i '' 's/\(File:[^|]*\)|[^]]*//g' em vez de perl

Leitura adicional:

por 04.04.2018 / 12:39
1

Eu escrevi um novo regex que corresponde a todo o [[...]] e o substitui apenas pelas coisas que você quer manter. Ele supõe que os nomes dos arquivos não contenham caracteres pipe | ou o terminador ]] . Não consigo reproduzir seu problema com xargs , mas o substituímos pela opção find -exec ; o seguinte funciona para mim no Linux.

find . -name "*.txt" -exec perl -i -pe 's/(\[\[File:[^|]*).*?(\]\])/$1$2/g' '{}' +
    
por 04.04.2018 / 12:41