shell - texto - ¿Cómo eliminar los espacios en blanco finales para varios archivos?
espacio entre palabras word (7)
¿Hay herramientas / líneas únicas de UNIX que eliminarían los espacios en blanco finales para múltiples archivos en el lugar .
Ej. Uno que podría usarse en la conjunción con find .
ex
Intenta usar el editor Ex (parte de Vim):
$ ex +''bufdo!%s//s/+$//e'' -cxa *.*
Nota: Para recursividad (bash4 y zsh), puede usar una nueva opción globbing ( **/*.*
). Habilitado por shopt -s globstar
.
perl
find . -type f -name "*.java" -exec perl -p -i -e "s/[ /t]$//g" {} /;
según el estilo de Spring Framework Code .
sed
Para usar sed
, compruebe: ¿Cómo eliminar los espacios blancos finales con sed?
Vea también: ¿Cómo eliminar el espacio en blanco final de todos los archivos recursivamente?
A diferencia de otras soluciones que requieren GNU sed, esta debería funcionar en cualquier sistema Unix que implemente comandos estándar POSIX.
find . -type f -name "*.txt" -exec sh -c ''for i;do sed ''s/[[:space:]]*$//'' "$i">/tmp/.$$ && mv /tmp/.$$ "$i";done'' arg0 {} +
Editar: esta versión ligeramente modificada conserva los permisos de los archivos:
find . -type f -name "*.txt" -exec sh -c ''for i;do sed ''s/[[:space:]]*$//'' "$i">/tmp/.$$ && cat /tmp/.$$ > "$i";done'' arg0 {} +
He estado usando this para arreglar el espacio en blanco:
while IFS= read -r -d '''' -u 9
do
if [[ "$(file -bs --mime-type -- "$REPLY")" = text/* ]]
then
sed -i -e ''s/[ /t]/+/(/r/?/)$//1/;$a/' -- "$REPLY"
else
echo "Skipping $REPLY" >&2
fi
done 9< <(find . /( -type d -regex ''^.*//./(git/|svn/|hg/)$'' -prune -false /) -o -type f -print0)
caracteristicas:
- Mantiene los retornos de carro (a diferencia de
[:space:]
), por lo que funciona bien en los archivos de estilo Windows / DOS. - Solo se preocupa por el espacio en blanco "normal": si tiene pestañas verticales o algo similar en sus archivos, probablemente sea intencional (código de prueba o datos sin formato).
- Salta los directorios .git y .svn VCS.
- Solo modifica los archivos cuyo
file
cree que es un archivo de texto. - Informa todas las rutas que fueron salteadas.
- Funciona con cualquier nombre de archivo.
Para aquellos que no son sed gurús (incluido yo mismo) he creado un pequeño script para usar expresiones regulares de JavaScript para reemplazar el texto en los archivos y el reemplazo en su lugar:
Para eliminar espacios en blanco al final puedes usarlo como tal:
$ node sed.js "/^[/t ]*$/gm" "" file
Disfrutar
Por alguna razón, los comandos sed y perl no funcionaron para mí. Esto hizo:
find ./ -type f | rename ''s/ +$//g''
Se siente como el más directo para leer también
Qué tal esto:
sed -e -i ''s/[ /t]*$//''
Por cierto, este es un sitio útil: http://sed.sourceforge.net/sed1line.txt
Usted quiere
sed --in-place ''s/[[:space:]]/+$//'' file
Eso eliminará todos los caracteres de espacios en blanco definidos por el estándar POSIX, incluida la pestaña vertical y el avance del formulario. Además, solo hará un reemplazo si el espacio en blanco final realmente existe, a diferencia de las otras respuestas que usan cero o más matcher ( *
).
--in-place
es simplemente la forma larga de -i
. Prefiero usar la forma larga en las secuencias de comandos porque tiende a ser más ilustrativo de lo que la bandera realmente hace.
Se puede integrar fácilmente con find
as so:
find . -type f -name ''*.txt'' -exec sed --in-place ''s/[[:space:]]/+$//'' {} /+
Si estás en una Mac
Como se señaló en los comentarios, lo anterior no funciona si no tiene instaladas las herramientas gnu. Si ese es el caso, puede usar lo siguiente:
find . -iname ''*.txt'' -type f -exec sed -i '''' ''s/[[:space:]]/{1,/}$//'' {} /+