Bash remove primeiro e último caracteres de uma string

81

Eu tenho uma string assim:

|abcdefg|

E eu quero pegar uma nova string chamada de alguma forma (como string2) com a string original sem os dois | no início e no final dele

para que eu tenha isso

abcdefg

isso é possível no bash?

    
por Matteo Pagliazzi 23.12.2011 / 15:29

8 respostas

107

Você pode fazer

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2

Ou se o tamanho da sua string for constante, você pode fazer

string="|abcdefg|"
string2=${string:1:7}
echo $string2

Além disso, isso deve funcionar

echo "|abcdefg|" | cut -d "|" -f 2

Também isso

echo "|abcdefg|" | sed 's/^|\(.*\)|$//'
    
por Kris Harper 23.12.2011 / 15:49
56

Aqui está uma solução que é independente do tamanho da string (bash):

string="|abcdefg|"
echo "${string:1:${#string}-2}"
    
por Samus_ 24.12.2011 / 17:28
21

Ao sair de alguns posts listados aqui, parece que a maneira mais simples de fazer isso é:

string="|abcdefg|"
echo ${string:1:-1}

edit: funciona no Ubuntu com o bash 4.2; não funciona em centOS com bash 4.1

    
por jlunavtgrad 05.09.2012 / 22:37
10

E outro:

string="|abcdefg|"
echo "${string//|/}"
    
por Steven Penny 09.06.2012 / 03:03
10

Outra maneira com head & cauda:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -1
abcdefg
    
por Zavior 26.11.2013 / 17:16
8

Você também pode usar sed para remover o | não apenas referenciando o símbolo em si, mas usando referências posicionais como em:

$ echo "|abcdefg|" | sed 's:^.\(.*\).$::'
abcdefg

Onde ':' são os delimitadores (você pode substituí-los por / ou qualquer caractere que não esteja na consulta, qualquer sinal seguindo os s fará isso) Here ^ (circunflexo) significa no início da string de entrada e $ ( dólar) significa no final. O . (ponto) que é após o cursor e o que está antes do sinal de dólar representar um único caractere. Então, em outras palavras, estamos excluindo o primeiro e o último caractere. Lembre-se de que isso excluirá todos os caracteres, mesmo que | não está presente na string.

EX:

$ echo "abcdefg" | sed 's:^.\(.*\).$::'
bcdef
    
por Metafaniel 08.02.2012 / 02:44
2

função shell

Uma abordagem um pouco mais detalhada, mas funciona em qualquer tipo de primeiro e último caractere, não precisa ser o mesmo. A ideia básica é que estamos pegando uma variável, lendo-a personagem por personagem, e acrescentando apenas aqueles nós queremos uma nova variável

Aqui está toda essa ideia formatada em uma boa função

crop_string_ends() {
    STR="$1" 
    NEWSTR="" 
    COUNT=0 
    while read -n 1 CHAR 
    do
        COUNT=$(($COUNT+1)) 
        if [ $COUNT -eq 1 ] || [ $COUNT -eq ${#STR} ] 
        then
            continue 
        fi 
        NEWSTR="$NEWSTR"$CHAR 
    done <<<"$STR" 
    echo $NEWSTR 
}

E aqui está a mesma função em ação:

$> crop_string_ends "|abcdefg|"                                                                                       
abcdefg
$> crop_string_ends "HelloWorld"                                                                                      
elloWorl

Python

>>> mystring="|abcdefg|"
>>> print(mystring[1:-1])
abcdefg

ou na linha de comando:

$ python -c 'import sys;print sys.stdin.read()[1:-2]' <<< "|abcdefg|"                                             
abcdefg

AWK

$ echo "|abcdefg|" | awk '{print substr($0,2,length($0)-2)}'                                                      
abcdefg

Ruby

$ ruby -ne 'print $_.split("|")[1]' <<< "|abcdefg|"                                                               
abcdefg
    
por Sergiy Kolodyazhnyy 06.04.2016 / 15:58
1

Solução pequena e universal:

expr "|abcdef|" : '.\(.*\).'

Especial neste caso e permitindo que o '|' personagem pode estar lá ou não:

expr "|abcdef" : '|*\([^|]*\)|*'
    
por Tosi Do 09.07.2017 / 01:29