Você pode usar sed
's w
marque com quer /dev/stderr
, /dev/tty
, /dev/fd/2
se suportada pelo seu sistema. Por exemplo, com uma entrada file
como:
foo first
second: missing
third: foo
none here
corrida
sed -i '/foo/{
s//bar/g
w /dev/stdout
}' file
saídas:
bar first
third: bar
embora o file
conteúdo tenha sido alterado para:
bar first
second: missing
third: bar
none here
Portanto, no seu caso, executando:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
s//bar/g
w /dev/fd/2
}' {} \;
irá editar os arquivos no local e na saída:
./arquivo1:
coisas de bar
mais bar
./file2:
./file3:
bar primeiro
terceiro: bar
Você também pode imprimir algo como, original line >>> modified line
por exemplo:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
h
s//bar/g
H
x
s/\n/ >>> /
w /dev/fd/2
x
}' {} \;
edita os arquivos no local e produz:
./arquivo1:
coisas foo >>> coisas bar
mais foo >>> mais bar
./file2:
./file3:
foo primeiro >>> barra primeiro
terceiro: foo >>> terceiro: bar
for x in `find . -type f`; do echo ///File $x: ; sed --quiet 's/abc/def/gp' $x; done
sed
expressões, não quero escrever/gp
para cada uma. Como configurá-lo globalmente?Eu não acho que isso é possível, mas uma solução alternativa pode ser usar perl:
Isso imprimirá as linhas alteradas para erro padrão. Por exemplo:
Você também pode tornar isso um pouco mais complexo, imprimindo o número da linha, o nome do arquivo, a linha original e a linha alterada:
fonte
$ARGV
o nome do arquivo que está sendo operado.perl
a sintaxe é muito semelhante àsed
da e não acho que o que você está pedindo seja realmente possívelsed
.É possível usar o sinalizador w que grava o padrão atual em um arquivo. Portanto, adicionando-o ao comando substitute, podemos relatar substituições sucessivas em um arquivo e imprimi-lo após a conclusão do trabalho. Também gosto de colorir a sequência substituída com grep.
Observe que deve haver apenas um espaço entre we seu nome de arquivo.
Isso é ainda melhor que o diff, pois o diffing também pode mostrar alterações mesmo que não tenham sido feitas pelo sed.
fonte
sed.done
. As linhas com "To" no arquivo original, portanto, não são impressos parased.done
, assim, quando vocêgrep "To" sed.done
só vai ver as linhas que são alteradas porsed
. Você não verá a linha original no arquivo antes ele foi substituído, se é isso que você está visando ...Eu gosto da solução @terdon - o perl é bom para isso.
Aqui está minha versão aprimorada que:
código
saída de exemplo
fonte