2011-06-15 18 views
18

Necesito reemplazar un carácter de barra con una pestaña para poder extraer un nombre de directorio usando awk.Reemplazando/con TAB utilizando sed

/path/to/some/USEFUL_INFORMATION/in/some/path 

He intentado hacer esto, pero todo lo que hace es poner una "t" en la parte de mi salida.

sed -e 's/\//\t/g' filename 

Cualquier ayuda sería apreciada.

+0

Esto parece depender de la versión de 'sed'. Pruebe 'tr '/' '\ t' Beta

+0

No necesita reemplazar '/' con 'TAB' y alimentarlo a' awk'. 'awk' simplemente puede hacerlo solo. – ssapkota

+1

Ahora que lo pienso, ¿qué tal 'cut -f5 -d '/' Beta

Respuesta

0

Uso + como delimitadores sed -e 's+/+\t+g '

echo 'path/to/something' | sed -e 's+/+\t+g' 

// path  to  something 

Editar: una manera más simple para extraer la ruta de un archivo:

dirname /path/to/file.txt 
#output /path/to 
+0

No reprodujo el error, ¿verdad? – Beta

+0

@Beta tienes razón, funciona en ambos para mí –

13

Trate awk:

awk '{gsub("/","\t",$0); print;}' filename 
+0

Esto funcionó perfectamente. ¡Gracias! –

+1

@Lance, si funciona, no olvides aceptar la respuesta. – ssapkota

+0

Esta es la única respuesta aquí que funcionó para mí en OS X –

0

un vistazo a dirname y basename

$ dirname /path/to/some/USEFUL_INFORMATION/in/some/path 
/path/to/some/USEFUL_INFORMATION/in/some 

$ basename /path/to/some/USEFUL_INFORMATION/in/some/path 
path 

awk puede manejar cualquier separador, por ejemplo, /:

$ echo /path/to/some/USEFUL_INFORMATION/in/some/path | awk -F"/" '{print $5}' 
USEFUL_INFORMATION 
29

En primer lugar, se puede utilizar otro carácter que el s/// delimitador. El comando

sed 's:ABC:DEF:g' 

es equivalente para

sed 's/ABC/DEF/g' 

Hará su comando más fácil de leer, ya que no tendrá que escapar de la barra.

Dicho eso, algunos seds no son compatibles con el escape de caracteres como \t. Me sucede mucho en Mac OS X, por ejemplo. Mi solución es pulsar Control + V y luego el carbón pestaña:

sed 's:/:<Control+V><TAB character>:g' 

El resultado en mi máquina es:

$ pwd 
/Users/brandizzi/sandbox/demo/mydemo 
$ pwd | sed 's:/:  :g' 
    Users brandizzi sandbox demo mydemo 

Sin embargo, si su intención es poner todos los directorios de ruta en las variables awk $1 , etc. $2 simplemente declaran la barra a ser el separador de campo con la bandera awk -F:

$ pwd 
/Users/brandizzi/sandbox/demo/mydemo 
$ pwd | awk -F/'{print $3 " " $5}' 
brandizzi demo 
+2

Gracias por el: propina para Mac. – Jesse

+0

Ídem. Justo lo que estaba buscando. – DGrady

+1

También funciona presionar '^ V^I' en Mac OS X – MichK

1

awk -F '/' '{print $ 5}' your_file

Esto imprime USEFUL_INFORMATION

Define el separador de campo para ser /. Tenga en cuenta que dado que sus cadenas comienzan con un/el primer campo es nulo, su recuento de campos será uno más de lo que podría pensar.

5

Encontré la respuesta, para mí, here.Tengo MacOSX, así que utilicé Control + v seguido de Control + i.

sed -e 's/\/[CTR+V][CTR+I]/g' filename 
0

Primero como los otros sugeridos, use otro carácter como delimitador. En segundo lugar, use $'\t'fuera de de las comillas. Ejemplo con ; como un delimitador:

$ echo "/path/to/some/USEFUL_INFORMATION/in/some/path" | sed -e 's;/;'$'\t'';g' 
path to some USEFUL_INFORMATION in some path 
+0

¿Qué versión de sed se está ejecutando en qué plataforma * NIX? –

1

tratar de poner comillas dobles (" ") alrededor en lugar de comilla simple (' ') como se muestra en el siguiente comando.

sed -i "s/\//\\t/g" filename

En general, utilizamos dobles comillas (" ") con el sed cuando se trata de los caracteres especiales.

Como en su caso, no ha escapado del \ en el carácter TAB (\ t).

2

Para reemplazar/TAB usando sed:

sed 's/\//\'$'\t/g' filename.txt 

Generalmente, (\ n) personajes lugar \ '$' antes de tabulador (\ t) y salto de línea. Funciona en bash.

para extraer el nombre del directorio:

En lo personal, me gustaría usar la respuesta de grok12.

awk -F'/' '{print $5}' filename.txt