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

Mat*_*zzi 122 command-line bash scripts

我有一个这样的字符串:

|abcdefg|
Run Code Online (Sandbox Code Playgroud)

我想以某种方式调用一个新字符串(如 string2),原始字符串|在开头和结尾没有两个字符,这样我就可以得到这个:

abcdefg
Run Code Online (Sandbox Code Playgroud)

这在bash中可能吗?

Kri*_*per 144

你可以做

string="|abcdefg|"
string2=${string#"|"}
string2=${string2%"|"}
echo $string2
Run Code Online (Sandbox Code Playgroud)

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

string="|abcdefg|"
string2=${string:1:7}
echo $string2
Run Code Online (Sandbox Code Playgroud)

此外,这应该工作

echo "|abcdefg|" | cut -d "|" -f 2
Run Code Online (Sandbox Code Playgroud)

还有这个

echo "|abcdefg|" | sed 's/^|\(.*\)|$/\1/'
Run Code Online (Sandbox Code Playgroud)

  • 而且,在 bash 4.2 和更新版本中,`"${string:1:-1}"` (17认同)
  • 还有`IFS='|' 读取 string2 <<< $string` :) (3认同)
  • 还有`awk -F\| '{ 打印 $2 }' <<<"|string|"` (2认同)

Sam*_*us_ 75

这是一个独立于字符串(bash)长度的解决方案:

string="|abcdefg|"
echo "${string:1:${#string}-2}"
Run Code Online (Sandbox Code Playgroud)


jlu*_*rad 48

离开这里列出的一些帖子,似乎最简单的方法是:

string="|abcdefg|"
echo ${string:1:-1}
Run Code Online (Sandbox Code Playgroud)

编辑:使用 bash 4.2 在 ubuntu 上工作;在带有 bash 4.1 的 centOS 上不起作用

  • 这应该是最重要的答案。在现代系统上你找不到任何 bash 4.1。:) (3认同)

小智 28

另一种方法是使用head&tail命令:

$ echo -n "|abcdefg|" | tail -c +2 | head -c -2
abcdefg
Run Code Online (Sandbox Code Playgroud)

  • 显然,应该是`echo -n "|abcdefg|" | 尾-c +2 | 头-c -1`。我不知道为什么我的编辑被拒绝了……老实说,这非常令人难过。有关详细信息,请参阅“男人头” (2认同)

小智 10

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

$ echo "|abcdefg|" | sed 's:^.\(.*\).$:\1:'
abcdefg
Run Code Online (Sandbox Code Playgroud)

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

前任:

$ echo "abcdefg" | sed 's:^.\(.*\).$:\1:'
bcdef
Run Code Online (Sandbox Code Playgroud)


Ste*_*nny 10

还有一个:

string="|abcdefg|"
echo "${string//|/}"
Run Code Online (Sandbox Code Playgroud)