Corte a corda pela metade com o último caractere específico mostrado na string

0

Por exemplo, com a string a_link_list_java , use o caractere _ para separar a string na metade, resultando em: a_link_list e java .

list_java resultaria em: list e java .

Eu quero pegar essas duas partes e armazená-las em duas variáveis.

Eu tentei o comando cut , mas ele só funciona para apenas um caractere mostrado na string

Como posso fazer isso em um script de shell bash?

    
por JohnnyP 03.08.2017 / 20:59

3 respostas

2

As expansões de parâmetros da shell podem fazer isso:

$ v="a_link_list_java"
$ printf "%s\n" "${v%_*}" "${v##*_}"
a_link_list
java

Embora observe que, se os padrões na expansão não corresponderem, nada será removido. Portanto, um valor sem sublinhado seria inalterado por ambas as transformações:

$ v=foo
$ printf "%s\n" "${v%_*}" "${v##*_}"
foo
foo
    
por 03.08.2017 / 21:19
0

com sed :

var1=$(sed 's/_[^_]*$//' file)
var2=$(sed 's/.*_//' file)

Observe que sed é muito ganancioso, portanto, no segundo caso, glob * engole todos os caracteres, incluindo os sublinhados anteriores _ .

Saída:

$ echo "$var1"
a_link_list
$ echo "$var2"
java
    
por 03.08.2017 / 21:18
0

Usando awk , você pode ter tudo em um delimitador de definição separado como _

VAR1=$(awk -F'_' '{print $1}' infile.txt) 

Você pode imprimir os campos que deseja com base em seu índice acima, em vez de $1 que aponta para o primeiro campo.

Ou você pode usar bash e ler como uma matriz.

IFS='_' read -r -a array <<< "$myString"

leia simplesmente com o número de índice individual:

echo "${array[2]}"

Ou simplesmente você pode usar a expansão do parâmetro bash:

VAR1="${myString%_*}"   # will gives you 'a_link_list' 
VAR2="${myString##*_}"  # will gives you 'java' 
VAR3="${VAR1%_*}"       # will gives you 'a_link' 
    
por 03.08.2017 / 21:06