Estou usando egrep -R
seguido por uma expressão regular contendo cerca de 10 uniões, assim:
.jpg | .png | .gif
etc. Isso funciona bem, agora gostaria de substituir todas as strings encontradas por.bmp
Eu estava pensando em algo como
egrep -lR "\.jpg|\.png|\.gif" . | sed "s/some_expression/.jpg/" file_it_came_form
Portanto, a questão aqui é como faço para fazer uma expressão regular de união semelhante em sed
e como faço para salvar as alterações no arquivo de onde obteve a entrada.
Respostas:
Use este comando:
egrep
: encontre linhas correspondentes usando expressões regulares estendidas-l
: lista apenas nomes de arquivos correspondentes-R
: pesquisa recursivamente em todos os diretórios fornecidos-Z
: use\0
como separador de registro"\.jpg|\.png|\.gif"
: corresponde a uma das strings".jpg"
,".gif"
ou".png"
.
: inicia a pesquisa no diretório atualxargs
: executa um comando com o stdin como argumento-0
: use\0
como separador de registro. Isso é importante para corresponder ao-Z
deegrep
e para evitar ser enganado por espaços e novas linhas nos nomes dos arquivos de entrada.-l
: use uma linha por comando como parâmetrosed
: O s tream ed itor-i
: substitui o arquivo de entrada com a saída sem fazer um backup-e
: use o seguinte argumento como expressão's/\.jpg\|\.gif\|\.png/.bmp/g'
: substitua todas as ocorrências das strings".jpg"
,".gif"
ou".png"
por".bmp"
fonte
sed -r
para expressões regulares estendidas. Nesse ponto, o padrão corresponderá ao que é usado em egrep e você pode querer colocá-lo em uma variável para reutilização.Honestamente, por mais que eu ame o sed para as tarefas apropriadas, esta é definitivamente uma tarefa para o perl - é verdadeiramente mais poderoso para este tipo de frases curtas, especialmente para "escrever de volta para onde ele vem" (o
-i
switch do perl faz isso para você e, opcionalmente, também permite que você mantenha a versão antiga, por exemplo, com um .bak anexado, basta usar no-i.bak
lugar).ao invés de trabalhos complexos em sed (se é que é possível lá) ou awk ...
fonte
sed
.. Acho que esqueci alguns sinalizadores para sed ou tinha limitações.Outra maneira de fazer isso
Alguma ajuda em relação ao comando acima
O find fará o find para você no diretório atual indicado por
.
-name
o nome do arquivo no meu caso seu pom.xml pode dar curingas.-exec
executarsed
editor de fluxo-i
ignorar casos
é para substituto/4.6.0.../
String a ser pesquisada/5.0.0.../
String a ser substituídafonte
Não consegui fazer nenhum dos comandos desta página funcionarem para mim: a solução sed adicionou uma nova linha ao final de todos os arquivos que processou e a solução perl não foi capaz de aceitar argumentos suficientes de find. Encontrei esta solução que funciona perfeitamente:
Isso irá percorrer novamente a árvore do diretório atual e substituí-lo
search_regex
porreplacement_string
quaisquer arquivos que terminem em.h
ou.m
.Eu também usei rpl para esse propósito no passado.
fonte
tente algo usando um loop for
não é bonito, mas deve servir.
fonte
|while read i
padrão permitiria streaming e evitaria restrições de comprimento quando os resultados de egrep se tornassem muito longosMeu caso de uso era que eu queria substituir
foo:/Drive_Letter
por.foo:/bar/baz/xyz
No meu caso, consegui fazer isso com o código a seguir. Eu estava no mesmo diretório onde havia grande quantidade de arquivos.espero que tenha ajudado.
ATUALIZAÇÃO s | foo: / Drive_letter: | foo: / ba / baz / xyz | g
fonte
sed 's|foo:/Drive_letter:|foo:/ba/baz/xyz|g'