Me gustaría eliminar todos los espacios y pestañas iniciales y finales de cada línea en una salida.
¿Existe una herramienta simple como trim
si pudiera canalizar mi salida?
Archivo de ejemplo:
test space at back
test space at front
TAB at end
TAB at front
sequence of some space in the middle
some empty lines with differing TABS and spaces:
test space at both ends
Respuestas:
o más corto:
Recortaría el espacio inicial y final o los caracteres de tabulación 1 y también exprimiría secuencias de tabulaciones y espacios en un solo espacio.
Eso funciona porque cuando asigna algo a uno de los campos ,
awk
reconstruye todo el registro (tal como se imprimeprint
) uniendo todos los campos ($1
, ...,$NF
) conOFS
(espacio por defecto).1 (y posiblemente otros caracteres en blanco según la configuración regional y la
awk
implementación)fuente
awk '{$1=$1}1'
;
se requiere en la sintaxis awk estándarecho -e 'foo \t bar' | awk '{$1=$1};1'
echo ' hello ' | xargs
El comando se puede condensar así si está utilizando GNU
sed
:Ejemplo
Aquí está el comando anterior en acción.
Puede usar
hexdump
para confirmar que elsed
comando está eliminando los caracteres deseados correctamente.Clases de personajes
También puede usar nombres de clase de caracteres en lugar de enumerar literalmente los conjuntos como este
[ \t]
:Ejemplo
La mayoría de las herramientas GNU que hacen uso de expresiones regulares (regex) admiten estas clases.
Usar estos en lugar de conjuntos literales siempre parece una pérdida de espacio, pero si le preocupa que su código sea portátil o tenga que lidiar con conjuntos de caracteres alternativos (piense en internacional), es probable que desee usar los nombres de clase en lugar.
Referencias
fuente
[[:space:]]
no es equivalente a[ \t]
en el caso general (unicode, etc.).[[:space:]]
probablemente será mucho más lento (ya que hay muchos más tipos de espacios en blanco en Unicode que solo' '
y'\t'
). Lo mismo para todos los demás.sed 's/^[ \t]*//'
No es portátil. En realidad, POSIX incluso requiere que se elimine una secuencia de espacio, barra diagonal inversa ot
caracteres, y eso es lo que GNUsed
también hace cuandoPOSIXLY_CORRECT
está en el entorno.sed 's/^[[:blank:]]*//;s/[[:blank:]]*$//'
Según lo sugerido por Stéphane Chazelas en la respuesta aceptada, ahora puede
crear un script
/usr/local/bin/trim
:y otorgue a ese archivo derechos ejecutables:
Ahora puede pasar cada salida a,
trim
por ejemplo:(para los comentarios a continuación: usé esto antes:
while read i; do echo "$i"; done
que también funciona bien, pero es menos eficiente)
fuente
while read -r line
para preservar barras invertidas y aun entonces ... . En cuanto a los archivos / velocidad enormes, realmente, elegiste la peor solución. No creo que haya nada peor por ahí. Vea las respuestas en ¿Por qué es una mala práctica utilizar un bucle de shell para procesar texto? incluido mi comentario sobre la última respuesta donde agregué un enlace a un punto de referencia de velocidad. Lassed
respuestas aquí están perfectamente bien IMO y mucho mejor queread
.-
y seguidas de combinaciones de 1 o más caracteres e, E o n, y / o contiene caracteres NUL. Además, se omitirá una línea no terminada después de la última línea nueva.Los xargs sin argumentos hacen eso.
Ejemplo:
fuente
xargs
no se entregará si la entrada contiene barras invertidas y comillas simples.echo
invocaciones. Algunas implementaciones de eco también procesarán opciones y / o barras invertidas ... Eso también solo funciona para la entrada de una sola línea.Si está leyendo una línea en una variable de shell,
read
ya lo hace a menos que se indique lo contrario .fuente
read
. Por lo tanto, si secat file | while read i; do echo $i; done
echo "$i"
para ver el verdadero efecto de laread
Si almacena líneas como variables, puede usar bash para hacer el trabajo:
eliminar espacios en blanco iniciales de una cadena:
eliminar espacios en blanco finales de una cadena:
eliminar todos los espacios en blanco de una cadena:
fuente
Para eliminar todos los espacios iniciales y finales de una línea dada gracias a una herramienta 'canalizada', puedo identificar 3 formas diferentes que no son completamente equivalentes. Estas diferencias se refieren a los espacios entre las palabras de la línea de entrada. Dependiendo del comportamiento esperado, harás tu elección.
Ejemplos
Para explicar las diferencias, consideremos esta línea de entrada ficticia:
tr
tr
Es realmente un comando simple. En este caso, elimina cualquier espacio o carácter de tabulación.awk
awk
elimina espacios iniciales y finales y los comprime en un solo espacio cada espacio entre palabras.sed
En este caso,
sed
elimina los espacios iniciales y posteriores sin tocar ningún espacio entre las palabras.Observación:
En el caso de una palabra por línea,
tr
hace el trabajo.fuente
[:space:]
, en lugar de [: blank:], para el comandotr
, como:,... | tr -d [:space:]
para eliminar nuevas líneas también. (ver:man tr
)sed es una gran herramienta para eso:
Puede usarlo para su caso ya sea canalizando en el texto, por ejemplo
o actuando sobre él 'en línea' si tu
sed
es el GNU:pero cambiar la fuente de esta manera es "peligroso" ya que puede ser irrecuperable cuando no funciona correctamente (¡o incluso cuando lo hace!), así que primero haga una copia de seguridad (o use el
-i.bak
que también tiene la ventaja de ser portátil para algunos BSDsed
) !fuente
comando de traducción funcionaría
fuente
Si la cadena que uno está tratando de recortar es corta y continua / contigua, simplemente puede pasarla como parámetro a cualquier función bash:
fuente