linux - substitute - sed replace string unix
¿Hay un ''git sed'' o equivalente? (7)
Digamos que quiero cambiar el nombre de un método en el código fuente contenido en un repositorio de git. Podría hacerlo a mano, pero el nombre del método podría estar en varios lugares (por ejemplo, prueba de unidad, documentación, método real). Para verificar dónde se usa el método, uso ''git grep''. Obtengo ''git grep'' para mostrar solo las líneas que quiero cambiar, y luego no tengo un flujo de trabajo para cambiar automáticamente esas líneas.
Estoy buscando una forma automática (con suerte usando herramientas git) para hacer este último paso. Esperaba que hubiera algún tipo de ''git sed'' o equivalente, pero no puedo encontrar ninguno.
La interfaz que estoy pensando sería agradable: git sed ''s / old-method-name / new-method-name / g''
Aquí hay una solución que combina los de Noufal y claytontstanley y evita tocar archivos que no cambiarán.
En el bloque [alias]
de mi archivo ~/.gitconfig
:
psed = !sh -c ''git grep --null --full-name --name-only --perl-regexp -e /"$1/" | xargs -0 perl -i -p -e /"s/$1/$2/g/"'' -
Usar:
git psed old_method_name new_method_name
Gracias a Noufal y Greg por sus publicaciones. Combiné sus soluciones y encontré una que usa git grep (más robusta que git ls-files para mi repositorio, ya que parece enumerar solo los archivos que tienen código src real en ellas -no carpetas de submódulos, por ejemplo), y también tiene el nombre del método anterior y el nuevo nombre del método en un solo lugar:
En el bloque [alias]
de mi archivo ~/.gitconfig
:
sed = ! git grep -z --full-name -l ''.'' | xargs -0 sed -i -e
Usar:
git sed ''s/old-method-name/new-method-name/ig''
Podrías hacer un
for i in $(git grep --full-name -l old_method_name)
do
perl -p -i -e ''s/old_method_name/new_method_name/g'' $i
done
pegue eso en un archivo en algún lugar y luego alias como git sed
en su configuración.
Actualización: El comentario de tchrist a continuación es una solución mucho mejor, ya que evita que Perl se reproduzca repetidamente.
Puede usar git ls-files
en combinación con xargs
y sed
:
git ls-files -z | xargs -0 sed -i -e ''s/old-method-name/new-method-name/g''
Si hay. En Ubuntu, el paquete git-extras
proporciona el comando. Instalarlo:
$ sudo apt-get install git-extras
Úselo como a continuación, por ejemplo, para corregir un problema de ortografía rápidamente:
$ git sed ''qoute'' ''quote''
Lamentablemente, no es compatible con filtros de archivos como lo que hace git grep:
$ git grep -e ''class'' -- ''*.py''
La misma funcionalidad también existe en Mac y otros sistemas operativos. Verifica su página de instalación .
Tenga en cuenta que al iniciar git 2.1 (Q3 2014) , puede establecer " full-name
" de forma predeterminada para git grep
.
(Ver commit 6453f7b por Andreas Schwab )
"
git grep
" aprendió la variable de configuracióngrep.fullname
para forzar "--full-name
" a ser predeterminado.
Esto puede causar regresiones en usuarios con guiones que no esperan este nuevo comportamiento.
Eso significa que las soluciones anteriores pueden beneficiarse de:
git config grep.full-name true
Y use:
psed = !sh -c ''git grep --null --name-only --perl-regexp -e /"$1/" | xargs -0 perl -i -p -e /"s/$1/$2/g/"'' -
Ver git-search-replace en github: está diseñado para esto exactamente.