Bash 从字符串中删除第一个和最后一个字符

Bash 从字符串中删除第一个和最后一个字符

我有一个这样的字符串:

|abcdefg|

我想要以某种方式(比如 string2)获取一个新字符串,其中原始字符串的|开头和结尾不包含两个字符,这样我就可以得到这样的结果:

abcdefg

在 bash 中这可能吗?

答案1

你可以做

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

或者如果你的字符串长度是恒定的,你可以这样做

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

另外,这应该可行

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

还有这个

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

答案2

这是一个与字符串长度无关的解决方案(bash):

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

答案3

从这里列出的几篇帖子来看,似乎最简单的方法是:

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

编辑:适用于带有 bash 4.2 的 ubuntu;不适用于带有 bash 4.1 的 centOS

答案4

您还可以使用 sed 删除 |,不仅引用符号本身,而且使用位置引用,如下所示:

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

其中 ':' 是分隔符(您可以用 / 或查询中没有的任何字符替换它们,任何跟在 s 后面的符号都可以)这里 ^(插入符号)表示在输入字符串的开头,而 $(美元符号)表示在结尾。插入符号后面的 .(点)和美元符号前面的 .(点)代表单个字符。换句话说,我们删除的是第一个和最后一个字符。请记住,这将删除任何字符,即使字符串中没有 |。

前任:

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

相关内容