Como selecionar uma seção de uma string usando o bash

1

Eu tenho uma matriz contendo strings que consistem em caminhos para arquivos no seguinte formato:

/path/to/file/14561234545_50303.TXT

Estou tentando selecionar a seção que está após o "1", mas antes do "_", para que parecesse 4561234545 . Eu tenho tentado fazer isso com sed, mas até agora não consegui obter apenas essa seção.

Alguém pode me ajudar a dar um exemplo de qual expressão eu precisaria para extrair apenas essa seção?

    
por user2988831 05.02.2014 / 23:54

3 respostas

0

Digamos que seu caminho esteja armazenado em uma variável bash path , use o operador de strip de cordas para remover os caracteres mais "/ 1". Então awk para imprimir até o _ char.

echo ${path##*/1} | awk -F_ '{print $1}'

    
por 05.02.2014 / 23:59
0

Você pode usar o expansão de parâmetros do bash em todos os elementos de um array:

$ paths=( /path/to/file/14561234545_50303.TXT /a/b/1ABCD_foo "/x/y/12 3 4 5_.e_f_g" )
$ new=( "${paths[@]##*/1}" )
$ new=( "${new[@]%%_*}" )
$ printf "%s\n" "${new[@]}"
4561234545
ABCD
2 3 4 5
    
por 06.02.2014 / 00:26
0

Sua pergunta é um pouco subespecificada, mas aqui está uma pequena solução usando sed (você disse sed , certo?; -))

input='/path/to/file/14561234545_50303.TXT'
section='basename $input | sed 's/^1\([^_]\+\).*//''

Explicado:

  1. puxe o nome do arquivo com basename (suponho que você precise executar a extração somente na parte do nome do arquivo)
  2. execute uma correspondência sed da seguinte forma:
    1. ^1 : corresponde 1 no início da string (mais uma vez, um palpite, adapte-se ao seu gosto)
    2. \( [^_]\+ \) : (espaços adicionados para maior clareza) correspondem a uma sequência de um ou mais ( \+ ) caracteres que não correspondem a underscore e salvam essa sequência em
    3. .* : corresponde a tudo o que se segue (começando com o sublinhado _ se a sua entrada for bem formada)
  3. substitua o texto correspondente (que é a cadeia inteira se sua entrada for bem formada!) com a sequência de caracteres não sublinhados extraídos na etapa 2.2

Você realmente precisa incluir .* no final da partida para consumir o restante da entrada. Se você não o fizer, o substituto na etapa 3 atuará somente na parte da string que leva ao sublinhado, e você ficará surpreso ao descobrir que sua saída é quase idêntica à sua entrada, exceto o líder 1 .

    
por 07.02.2014 / 10:10

Tags