Tengo un archivo ASCII que contiene rutas de archivos que leí ejecutando:
while read p; do echo $p; done < filelist.txt
El archivo contiene rutas de archivo con el siguiente patrón:
./first/example1/path
./second/example1/path
./third/example2/path
¿Cómo puedo obtener una parte específica de la cadena de ruta (de /
a /
), por ejemplo, necesito obtener una salida que imprima:
first
second
third
y también
example1
example1
example2
Estoy seguro de que hay una manera de hacerlo usando expresiones regulares y sed
, pero no estoy familiarizado con eso.
command-line
bash
text-processing
mcExchange
fuente
fuente
| cut -d/ -f3
en una tubería hizo el truco. ¡Gracias! Este es el comando completo ahora:while read p; do echo $p; done < filelist.txt | cut -d/ -f3
cut -d/ -f3 filelist.txt
Puede hacerlo directamente en su
read
comando, usando laIFS
variable egfuente
Puedes usar
awk
fuente
Si queremos algún elemento de la ruta, es mejor usar algo que pueda dividir una cadena en campos, como awk, cortar ,pitóno perl. Sin embargo,golpetazo También puede hacer el trabajo con la sustitución de parámetros, utilizando el reemplazo de patrones y arrojando todo en una matriz.
Ahora tenemos una variedad de artículos hechos fuera del camino. Tenga en cuenta que si la ruta contiene espacios, puede implicar la alteración del separador de campo interno
IFS
.fuente
Bash y
cut
son el camino a seguir, sin embargo, una alternativa con Perl:para el segundo
/
campo delimitado ypara el tercer
/
campo delimitado.-l
: habilita el procesamiento automático de final de línea. Tiene dos efectos separados. Primero, automáticamente divide $ / (el separador de registro de entrada) cuando se usa con -n o -p. En segundo lugar, asigna $ \ (el separador de registro de salida) para que tenga el valor de octnum, de modo que cualquier declaración de impresión tendrá ese separador agregado nuevamente. Si se omite octnum, establece $ \ en el valor actual de $ /.-a
: activa el modo de división automática cuando se usa con -n o -p. Un comando de división implícito para la matriz @F se realiza como lo primero dentro del bucle while implícito producido por -n o -p.-n
: hace que Perl asuma el siguiente ciclo alrededor de su programa, lo que lo hace iterar sobre argumentos de nombre de archivo algo así como sed -n o awk:-e
: puede usarse para ingresar una línea de programa;print(@F[N])
: imprime el enésimo campo.fuente