Se podría utilizar sed
's w
, marca con cualquiera /dev/stderr
, /dev/tty
, /dev/fd/2
si es compatible en su sistema. Por ejemplo, con una entrada file
como:
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 file
contenido 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 line
por 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; done
sed
expresiones, no quiero escribir/gp
para 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
$ARGV
para el nombre del archivo que se está utilizando .perl
tenga en cuenta que para cosas simples como esta, la sintaxis es muy similar ased
la 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.done
que 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