Comando para imprimir conteúdo antes de um símbolo (último caractere de uma linha)

Comando para imprimir conteúdo antes de um símbolo (último caractere de uma linha)

Vamos considerar que tenho 3 arquivos:

abc_def_12345.zip
abc_123.zip
abc_def_ghi_3432.zip

Quero imprimir apenas os caracteres antes do último sublinhado (_)

A saída esperada é:

abc_def
abc
abc_def_ghi

Responder1

Você pode usar o bash com expansão de parâmetros:

$ foo="abc_def_ghi_3432.zip"; echo "${foo%_*}"
$ abc_def_ghi

Responder2

Com sed, você poderia tentar

sed -E 's/(.*)_.*/\1/'

por exemplo, copie e cole isso em um prompt de comando

% cat << EOF | sed -E 's/(.*)_.*/\1/'
abc_def_12345.zip
abc_123.zip
abc_def_ghi_3432.zip
EOF

saída

abc_def
abc
abc_def_ghi

observe que este comando deixa seda impressão automática do espaço do padrão no lugar, o que significa que quaisquer outras linhas que não correspondam ao padrão (ou seja, não contenham nenhum _'s, farão parte da saída. Se você não quiser isso, você poderia usar

sed -n -E 's/(.*)_.*/\1/p'

informação relacionada