Bash remove o primeiro e o último caracteres de uma corda

Tenho um fio como esse:

|abcdefg|

E quero receber uma nova corda chamada algures (como a corda2) com a corda original sem os dois caracteres ```` no início e no fim, para que eu tenha isto:

abcdefg

Será isso possível em bash?

Solução

Pode fazer

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

Ou se o comprimento do seu fio for constante, pode fazer

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

Além disso, isto deve funcionar

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

Também isto

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
Comentários (5)

Aqui's uma solução que é independente do comprimento da corda (bash):

string="|abcdefg|"
echo "${string:1:${#string}-2}"
Comentários (0)

Também se 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:^.\(.*\).$:\1:'
abcdefg

Onde ':' são os delimitadores (pode substituí-los por / ou qualquer caracter que não esteja na consulta, qualquer sinal a seguir ao s fá-lo-á) Aqui ^ (carpete) significa no início da cadeia de entrada e $ (dólar) significa no fim. O . (ponto) que it's após o caret e o que it's antes do sinal do dólar representa um único caractere. Por outras palavras, estamos a apagar o primeiro e o último caracteres. Tenham em mente que isto irá apagar quaisquer caracteres mesmo que | it's não estejam presentes na corda.

EX:

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Comentários (0)