Se podría utilizar sed's w, marca con cualquiera /dev/stderr, /dev/tty, /dev/fd/2si es compatible en su sistema. Por ejemplo, con una entrada filecomo:
foo first
second: missing
third: foo
none here
corriendo
sed -i '/foo/{
s//bar/g
w /dev/stdout
}' file
salidas:
bar first
third: bar
aunque el filecontenido se cambió a:
bar first
second: missing
third: bar
none here
Entonces, en su caso, ejecutando:
find . -type f -printf '\n%p:\n' -exec sed -i '/foo/{
s//bar/g
w /dev/fd/2
}' {} \;
editará los archivos en el lugar y la salida:
./file1:
cosas de bar
más bar
./file2:
./file3:
bar primero
tercero: barra
También puede imprimir algo como, original line >>> modified linepor ejemplo:
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 los archivos en el lugar y genera:
./file1:
foo cosas >>> cosas de bar
más foo >>> más bar
./file2:
./file3:
foo primero >>> barra primero
tercero: foo >>> tercero: bar
for x in `find . -type f`; do echo ///File $x: ; sed --quiet 's/abc/def/gp' $x; donesedexpresiones, no quiero escribir/gppara cada una. ¿Cómo configurarlo globalmente?No creo que sea posible, pero una solución podría ser usar perl en su lugar:
Esto imprimirá las líneas alteradas al error estándar. Por ejemplo:
También puede hacer esto un poco más complejo, imprimiendo el número de línea, el nombre del archivo, la línea original y la línea modificada:
fuente
$ARGVpara el nombre del archivo que se está utilizando .perltenga en cuenta que para cosas simples como esta, la sintaxis es muy similar asedla de y no creo que sea posible con lo que está pidiendosed.Es posible usar la bandera w que escribe el patrón actual en un archivo. Por lo tanto, al agregarlo al comando sustituto podemos informar sucesivas sustituciones a un archivo e imprimirlo después de que el trabajo esté terminado. También me gusta colorear la cadena reemplazada con grep.
Tenga en cuenta que solo debe haber un espacio entre w y su nombre de archivo.
Esto es incluso mejor que diff, ya que diffing también puede mostrar cambios incluso si no fueron hechos por sed.
fuente
sed.done. Por lo tanto, las líneas con "Para" en el archivo original no se imprimen ensed.done, por logrep "To" sed.doneque solo verá las líneas que se cambiansed. No verá la línea original en el archivo antes de que fuera sustituida, si eso es a lo que apunta ...Me gusta la solución @terdon: Perl es bueno para esto.
Aquí está mi versión modificada que:
código
salida de ejemplo
fuente