Bash elimina el primer y el último carácter de una cadena

Tengo una cadena como esa:

|abcdefg|

Y quiero obtener una nueva cadena llamada de alguna manera (como cadena2) con la cadena original sin los dos caracteres | al principio y al final de la misma para que me quede así:

abcdefg

¿Es eso posible en bash?

Solución

Puedes hacer

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

O si la longitud de tu cadena es constante, puedes hacer

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

Además, esto debería funcionar

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

También esto

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

Aquí'hay una solución que es independiente de la longitud de la cadena (bash):

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

También puede utilizar sed para eliminar el | no sólo haciendo referencia al símbolo en sí, sino utilizando referencias posicionales como en:

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

Donde ':' son los delimitadores (puedes sustituirlos por / o por cualquier carácter que no esté en la consulta, cualquier signo que siga a la s lo hará) Aquí ^ (caret) significa al principio de la cadena de entrada y $ (dollar) significa al final. El . (punto) que está después del signo de intercalación y el que está antes del signo de dólar representan un solo carácter. En otras palabras, estamos borrando el primer y el último carácter. Tenga en cuenta que esto borrará cualquier carácter aunque no esté presente en la cadena.

EJ:

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