Tengo una cadena como la siguiente:
test.de. 1547 IN SOA ns1.test.de. dnsmaster.test.de. 2012090701 900 1000 6000 600
ahora quiero reemplazar todas las pestañas / espacios entre los registros con un solo espacio para poder usarlo fácilmente con cut -d " "
Intenté lo siguiente:
sed "s/[\t[:space:]]+/[:space:]/g"
y varias variaciones pero no pude hacerlo funcionar. ¿Algunas ideas?
cut
apoyos-w
?Respuestas:
Utilizar
sed -e "s/[[:space:]]\+/ /g"
Aquí hay una explicación:
Para su reemplazo, solo desea insertar un espacio.
[:space:]
no funcionará allí ya que es una abreviatura para una clase de personaje y el motor de expresiones regulares no sabría qué personaje poner allí.Se
+
debe escapar en la expresión regular porque con el motor de expresión regular de sed+
es un carácter normal, mientras que\+
es un metacarácter para 'uno o más'. En la página 86 de Mastering Regular Expressions , Jeffrey Friedl menciona en una nota al pie de página que ed y grep usaron paréntesis escapados porque "Ken Thompson sintió que las expresiones regulares se usarían principalmente con el código C, donde la necesidad de unir paréntesis sin procesar sería más común que la referencia inversa ". Supongo que él sentía lo mismo por el signo más, de ahí la necesidad de escapar de él para usarlo como metacarácter. Es fácil dejarse engañar por esto.En sed que necesita para escapar
+
,?
,|
,(
, y)
. o use -r para usar expresiones regulares extendidas (entonces parecesed -r -e "s/[[:space:]]\+/ /g"
osed -re "s/[[:space:]]\+/ /g"
fuente
\+
lugar de solo+
?\+
Puede usar la
-s
opción ("apretar") detr
:La
[:blank:]
clase de caracteres comprende espacios y tabulaciones.fuente
Me gusta usar el siguiente alias para bash. Basándose en lo que otros escribieron, use sed para buscar y reemplazar múltiples espacios con un solo espacio. Esto ayuda a obtener resultados consistentes del corte. Al final, lo ejecuté una vez más para cambiar el espacio a la pestaña para que sea más fácil de leer.
fuente