Substitua uma linha contendo caracteres especiais em todos os arquivos recursivamente usando SED MAC

Substitua uma linha contendo caracteres especiais em todos os arquivos recursivamente usando SED MAC

Eu estava tentando substituir uma linha por outra usando SEDon. MAC OS X Terminal Tenho um cenário onde preciso substituir uma linha em todos os arquivos presentes em um diretório por outra linha. Ambas as linhas são complexas e possuem diferentes caracteres e símbolos especiais.

Como posso substituí-lo?

Eu preciso substituir

import { wait } from 'path/and-child-path'

com

import { wait } from 'path/path/and-child-path'

O que eu estava tentando é

find . -type f | xargs sed -i '' "s@import { wait } from 'path/and-child-path'@import { wait } from 'path/and-child-path'@g"

Isso não funciona. Por favor, me ajude.

Responder1

O sedque você forneceu tem o mesmo padrão de correspondência e substituição (caso não tenha sido um erro de digitação), portanto você não pode esperar nenhuma alteração nos arquivos. Além disso, o ''bit não deveria estar lá.

Corrigindo esses pontos, vocêseriaacabar com

find . -type f | xargs sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g"

Mesmo assim, esse código falharáno caso geral, porque os nomes dos arquivos podem conter caracteres de espaço (e até mesmo de nova linha!), que é exatamente o que xargsusa como delimitadores. Portanto, se você tiver o arquivo A X, sedserá instruído a agir sobre os arquivos Ae X.

-execopção resolve o problema diretamente:

find . -maxdepth 1 -type f -exec sed -i \
"s@import { wait } from 'path/and-child-path'@import { wait } from 'path/path/and-child-path'@g" {} +

Observe que eu também adicionei -maxdepth 1, caso contrário, findtambém cairia em subdiretórios.

informação relacionada