Eu estava tentando substituir uma linha por outra usando SED
on. 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 sed
que 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 xargs
usa como delimitadores. Portanto, se você tiver o arquivo A X
, sed
será instruído a agir sobre os arquivos A
e X
.
-exec
opçã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, find
também cairia em subdiretórios.