Eu tenho um arquivo ASCII contendo caminhos de arquivo que li executando:
while read p; do echo $p; done < filelist.txt
O arquivo contém caminhos de arquivo com o seguinte padrão:
./first/example1/path
./second/example1/path
./third/example2/path
Como posso obter uma parte específica da string do caminho (de /
para /
), por exemplo, preciso obter uma saída que imprima:
first
second
third
e também
example1
example1
example2
Tenho certeza de que existe uma maneira de fazer isso usando expressões regulares e sed
, mas não estou familiarizado com isso.
command-line
bash
text-processing
mcExchange
fonte
fonte
| cut -d/ -f3
um cachimbo fez o truque. Obrigado! Este é o comando completo agora:while read p; do echo $p; done < filelist.txt | cut -d/ -f3
cut -d/ -f3 filelist.txt
Você poderia fazê-lo diretamente em seu
read
comando, usando aIFS
variável egfonte
Você pode usar
awk
fonte
Se quisermos qualquer elemento do caminho, é melhor usar algo que possa dividir uma sequência em campos, como awk, cortar ,Pitãoou perl. Contudo,bater também pode fazer o trabalho com substituição de parâmetro, usando substituição de padrão e jogando tudo em uma matriz.
Agora, temos uma variedade de itens fora do caminho. Observe que, se o caminho contiver espaços, poderá envolver a alteração do separador de campo interno
IFS
.fonte
Bash e
cut
são o caminho a percorrer, no entanto, uma alternativa usando Perl:para o segundo
/
campo delimitado epara o terceiro
/
campo delimitado.-l
: ativa o processamento automático de final de linha. Tem dois efeitos separados. Primeiro, ele chomps $ / (o separador de registro de entrada) automaticamente quando usado com -n ou -p. Segundo, ele atribui $ \ (o separador de registros de saída) para ter o valor de octnum, para que quaisquer instruções de impressão tenham esse separador adicionado novamente. Se o octnum for omitido, configure $ \ para o valor atual de $ /.-a
: ativa o modo de divisão automática quando usado com -n ou -p. Um comando de divisão implícito para a matriz @F é feito como a primeira coisa dentro do loop while implícito produzido pelo -n ou -p.-n
: faz com que o Perl assuma o seguinte loop em torno do seu programa, o que faz com que ele itere sobre os argumentos do nome do arquivo, como sed -n ou awk:-e
: pode ser usado para inserir uma linha de programa;print(@F[N])
: imprime o enésimo campo.fonte