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}'
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?
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
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
: corresponde 1 no início da string (mais uma vez, um palpite, adapte-se ao seu gosto) \( [^_]\+ \)
: (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
.*
: corresponde a tudo o que se segue (começando com o sublinhado _
se a sua entrada for bem formada) 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
.