Qual é a maneira mais simples de encontrar e substituir uma determinada string de entrada, digamos abc
, e substituir por outra string, digamos XYZ
no arquivo /tmp/file.txt
?
Estou escrevendo um aplicativo e usando o IronPython para executar comandos através do SSH - mas não conheço o Unix tão bem e não sei o que procurar.
Ouvi dizer que o Bash, além de ser uma interface de linha de comando, pode ser uma linguagem de script muito poderosa. Portanto, se isso for verdade, presumo que você possa executar ações como estas.
Posso fazer isso com o bash, e qual é o script mais simples (uma linha) para alcançar meu objetivo?
sed
:s/..../..../ - Substitute
e/g - Global
invalid command code C
erro ... Para substituições no local, o BSDsed
requer uma extensão de arquivo após o-i
sinalizador, pois salva um arquivo de backup com a extensão especificada. Por exemplo:sed -i '.bak' 's/find/replace/' /file.txt
Você pode pular o backup usando uma string vazia assim:sed -i '' 's/find/replace/' /file.txt
s/abc/XYZ/gi
A manipulação de arquivos normalmente não é feita pelo Bash, mas por programas invocados pelo Bash, por exemplo:
A
-i
bandeira diz para fazer uma substituição no local.Veja
man perlrun
para obter mais detalhes, incluindo como fazer um backup do arquivo original.fonte
perl -pi -e 's/chdir (?:\\/[\\w\\.\\-]+)+/chdir blah/g' text
, mas continuo recebendo um erro com Não ter espaço entre o padrão e a palavra a seguir é preterido na linha -e 1. Incomparável (no regex; marcado por <- HERE em m / (chdir) () (<- HERE ?: \\ / na linha -e 1.Fiquei surpreso quando me deparei com isso ...
Há um
replace
comando que acompanha o"mysql-server"
pacote; portanto, se você o instalou, tente:Veja
man replace
mais sobre isso.fonte
replace
é uma ferramenta independente útil e o pessoal do MySQL deve liberá-la separadamente e depender dela b)replace
requer um pouco de MySQL o_O De qualquer maneira, instalar o mysql-server para obter substituição seria a coisa errada a fazer :)mysql-server
pacote instalado. Como apontado por @rayro,replace
faz parte disso.Este é um post antigo, mas para quem quiser usar variáveis como @centurian, as aspas simples significam que nada será expandido.
Uma maneira simples de obter variáveis é fazer a concatenação de cadeias, pois isso é feito por justaposição no bash, o seguinte deve funcionar:
fonte
O Bash, como outras conchas, é apenas uma ferramenta para coordenar outros comandos. Normalmente, você tentaria usar comandos UNIX padrão, mas é claro que pode usar o Bash para chamar qualquer coisa, incluindo seus próprios programas compilados, outros scripts de shell, scripts Python e Perl etc.
Nesse caso, existem algumas maneiras de fazer isso.
Se você deseja ler um arquivo e gravá-lo em outro arquivo, pesquisando / substituindo à medida que avança, use sed:
Se você deseja editar o arquivo no local (como se estivesse abrindo o arquivo em um editor, editando-o e salvando-o), forneça instruções ao editor de linha 'ex'
Ex é como vi sem o modo de tela cheia. Você pode dar os mesmos comandos que você faria no prompt ':' do vi.
fonte
Encontrei esse tópico entre outros e concordo que ele contém as respostas mais completas, por isso estou adicionando as minhas também:
sed
eed
são tão úteis ... à mão. Veja este código de @Johnny:Quando minha restrição é usá-lo em um script de shell, nenhuma variável pode ser usada no lugar de "abc" ou "XYZ". O BashFAQ parece concordar com o que eu entendo pelo menos. Então, eu não posso usar:
Mas o que nós podemos fazer? Como, @Johnny disse, use um
while read...
mas, infelizmente, esse não é o fim da história. O seguinte funcionou bem comigo:Como se pode ver se
nullglob
está definido então, ele se comporta estranhamente quando há uma string que contém a*
as in:que se torna
não há colchetes angulares finais e o Apache2 nem pode carregar.
Esse tipo de análise deve ser mais lento que a pesquisa com um clique e substituir, mas, como você já viu, existem quatro variáveis para quatro padrões de pesquisa diferentes trabalhando em um ciclo de análise.
A solução mais adequada em que consigo pensar com as suposições dadas do problema.
fonte
sed -e "s/$x/$y/"
, e vai funcionar. Não são aspas duplas. Pode ficar seriamente confuso se as seqüências de caracteres nas próprias variáveis contiverem caracteres com significado especial. Por exemplo, se x = "/" ou x = "\". Quando você enfrenta esses problemas, provavelmente significa que você deve parar de tentar usar o shell para este trabalho.Você pode usar
sed
:Use
-i
para "ignorar maiúsculas e minúsculas" se não tiver certeza de que o texto a ser encontrado éabc
ouABC
ouAbC
, etc.Você pode usar
find
e,sed
se não souber seu nome de arquivo:Encontre e substitua em todos os arquivos Python:
fonte
Você também pode usar o
ed
comando para pesquisar em arquivos e substituir:Veja mais em " Editando arquivos via scripts com
ed
".fonte
sed -i <pattern> <filename>
). Muito agradável!Se o arquivo em que você está trabalhando não é tão grande, e armazená-lo temporariamente em uma variável não é problema, você pode usar a substituição de string Bash em todo o arquivo de uma só vez - não há necessidade de revisá-lo linha por linha:
Todo o conteúdo do arquivo será tratado como uma cadeia longa, incluindo quebras de linha.
XYZ pode ser uma variável
$replacement
, por exemplo , e uma vantagem de não usar sed aqui é que você não precisa se preocupar que a cadeia de pesquisa ou substituição possa conter o caractere delimitador do padrão sed (geralmente, mas não necessariamente, /). Uma desvantagem é não poder usar expressões regulares ou nenhuma das operações mais sofisticadas do sed.fonte
Cuidado se você substituir os URLs pelo caractere "/".
Um exemplo de como fazer isso:
Extraído de: http://www.sysadmit.com/2015/07/linux-reemplazar-texto-en-archivos-con-sed.html
fonte
Experimente o seguinte comando shell:
fonte
sed
, use emsed -i''
vez disso.Para editar o texto no arquivo de maneira não interativa, você precisa de um editor de texto no local, como o vim.
Aqui está um exemplo simples de como usá-lo na linha de comando:
Isso é equivalente à resposta @slim do ex editor, que é basicamente a mesma coisa.
Aqui estão alguns
ex
exemplos práticos.Substituindo texto
foo
porbar
no arquivo:Removendo os espaços em branco à direita para vários arquivos:
Solução de problemas (quando o terminal está preso):
-V1
param para mostrar mensagens detalhadas.-cwq!
.Veja também:
fonte
-V1
, para forçar o encerramento, usewq!
.Você também pode usar python no script bash. Não tive muito sucesso com algumas das principais respostas aqui e achei que funcionava sem a necessidade de loops:
fonte
Você pode usar o comando rpl. Por exemplo, você deseja alterar o nome de domínio em todo o projeto php.
Esta não é uma clara causa de causa, mas é muito rápida e útil. :)
fonte