Tengo un script de shell simple que elimina los espacios en blanco finales de un archivo. ¿Hay alguna forma de hacer que este script sea más compacto (sin crear un archivo temporal)?
sed 's/[ \t]*$//' $1 > $1__.tmp
cat $1__.tmp > $1
rm $1__.tmp
sed
whitespace
Viktor
fuente
fuente
mv
lugar decat
yrm
. ¿Por qué estás usandocat
así de todos modos? ¿Por qué no usarcp
?cat
para sobrescribir el archivo original en lugar demv
reemplazar realmente los datos en el archivo original (es decir, no romperá los vínculos físicos). Usarsed -i
como se propone en muchas soluciones no hará eso. OIA, sigue haciendo lo que estás haciendo.Respuestas:
Puede utilizar la opción en lugar
-i
desed
para Linux y Unix:Tenga en cuenta que la expresión eliminará las pistas finales
t
en OSX (puede usargsed
para evitar este problema). También puede eliminarlos en BSD.Si no tiene gsed, aquí está la sintaxis sed correcta (pero difícil de leer) en OSX:
Finalmente, tres cadenas entre comillas simples se concatenan en un solo argumento / expresión. No hay un operador de concatenación en bash, simplemente colocas cadenas una tras otra sin espacios entre ellas.
El se
$'\t'
resuelve como un carácter de tabulación literal en bash (usando comillas ANSI-C ), por lo que la tabulación está correctamente concatenada en la expresión.fuente
sed: Not a recognized flag: i
t
:)\t
es una pestaña, para aquellos que aún no lo saben.Al menos en Mountain Lion, la respuesta de Viktor también eliminará el carácter 't' cuando esté al final de una línea. Lo siguiente corrige ese problema:
fuente
-E
indicación de "expresiones regulares extendidas (modernas)"sed
en El Capitán no lo hizo.Gracias a codaddict por sugerir la
-i
opción.El siguiente comando resuelve el problema en Snow Leopard
fuente
\t
con sed que no sea GNU sed y se interpreta como una letra literalt
. El comando solo parece funcionar, probablemente porque no hay TAB en el espacio en blanco final nit
al final de una oración en su archivo.''
No se recomienda el uso sin especificar un sufijo de respaldo.Es mejor cotizar también $ 1:
fuente
fuente
Tengo un script en mi .bashrc que funciona en OSX y Linux (¡solo bash!)
a lo que agrego:
fuente
Para aquellos que buscan eficiencia (muchos archivos para procesar o archivos enormes), usar el
+
operador de repetición en lugar de*
hace que el comando sea más del doble de rápido.Con GNU sed:
También comparé rápidamente algo más: usar en
[ \t]
lugar de[[:space:]]
también acelera significativamente el proceso (GNU sed v4.4):fuente
Solo por diversión:
fuente
En el caso concreto de
sed
, la-i
opción que otros ya han mencionado es de lejos la más simple y cuerda.En el caso más general
sponge
, de lamoreutils
colección, hace exactamente lo que quiere: le permite reemplazar un archivo con el resultado de procesarlo, de una manera específicamente diseñada para evitar que el paso de procesamiento se tropiece al sobrescribir el mismo archivo que está. trabajando en. Para citar lasponge
página del manual:https://joeyh.name/code/moreutils/
fuente
Para quitar solo los espacios en blanco (en mi caso, espacios y tabulaciones) de las líneas con al menos un carácter que no sea un espacio en blanco (de esta manera, las líneas vacías con sangría no se tocan):
fuente