在bash-joining参数替换中修剪尾随斜杠和前导斜杠?

在bash-joining参数替换中修剪尾随斜杠和前导斜杠?,bash,shell,sh,Bash,Shell,Sh,我试图在bash中从字符串的开头和结尾修剪一个可能的/ 我可以通过以下方式实现这一点: string="/this is my string/" string=${string%/} string=${string#/} echo $string # "this is my string" 但是,我想知道是否有办法将这两条线(2+3)连接起来,同时替换这两条线。有没有办法加入替补,或者这是我能得到的最好的 提前感谢。如果您愿意使用sed您可以: string="/this is my stri

我试图在bash中从字符串的开头和结尾修剪一个可能的
/

我可以通过以下方式实现这一点:

string="/this is my string/"
string=${string%/}
string=${string#/}
echo $string # "this is my string"
但是,我想知道是否有办法将这两条线(2+3)连接起来,同时替换这两条线。有没有办法加入替补,或者这是我能得到的最好的


提前感谢。

如果您愿意使用
sed
您可以:

string="/this is my string/"
echo $string | sed 's/^\/\(.*\)\/$/\1/g'

如果
/
始终位于字符串的开头和/或结尾,则假定斜杠位于字符串的开头和/或结尾

echo "${string//\/}"
this is my string
如果不是

string="/this is /my string/"
IFS=/ read -ra x <<<"$string"
(IFS=/; printf '%s\n' "${x[*]:1:${#x[*]}-1}")
this is /my string

不幸的是,没有办法做到这一点。但是,如果您确定字符串以/开头,以/结尾,则可以使用
${P:M:N}
格式对其进行修剪:

string='/this is my string/'
string=${string:1:(-1)}
添加支票也会有所帮助,但仍然有两种说法:

[[ $string == /*/ ]] && string=${string:1:(-1)}

注意:解决方案仅在Bash 4.2开始时可用。

另一个纯
Bash
解决方案(v3.2或更高版本),使用
=
进行正则表达式匹配,并使用特殊的
$Bash\u重新匹配
数组变量引用捕获组结果

string='/this is my string/'
[[ $string =~ ^/(.*)/$ ]] && string=${BASH_REMATCH[1]}
$string
如果其值未包含在
/
中,则保持不变

#!/bin/bash
truncate_leadingSlash()
{
 local string="$1"
 local len=${#string}
 while [[ "${string:$(expr $len - 1)}" == "/" ]]
 do
  string=${string:0:$(expr $len - 1)}
  len=${#string}
 done
 echo $string
}

truncate_leadingSlash "Autobiography/Of/Yogi//////"

输出:“Autobiography/Of/Yogi”

很晚才提交。。。可以使用bash变量替换来删除前导或尾随可选斜杠,但不能同时删除这两个斜杠。如果我们执行:

VAR1=/one/two/
VAR2=one/two
echo ${VAR1} ${VAR2}
echo ${VAR1#/} ${VAR2#/}
echo ${VAR1%/} ${VAR%/}
然后我们得到:

/one/two/ one/two            # No change
one/two/ one/two             # No leading slashes
/one/two /one/two            # No trailing slashes
正如我们所看到的,变量中的斜杠保持不变

可以使用中间变量将它们组合为:

VAR3=${VAR1#/}               # Remove optional leading slash
VAR3=${VAR3%/}               # Remove optional trailing slash
echo ${VAR3}

你的
/
总是在开头和结尾吗?可以,但不能保证。我还需要在字符串中保留斜杠。请注意,您当前编写的第一个赋值(
string=/this is my string/
)在语法上无效-您需要在值周围加引号。@mklement0 yeah只是一个输入错误,应该在字符串中保留斜杠,对吗?这是最快的方法吗?它只在
^
操作符开头和
$
操作符末尾去除斜杠。如果它是我不知道的最快的,你应该自己测试一下,最快的是问题本身的两行。避免使用叉子。无论如何:res=$(echo)/what ever/“|sed's@^/@;s@/$@')--也要避免反斜杠。@zackehhh9如果你能做到
string=${string%/};string=${string#/}
您最好选择它而不是sed它比分叉和管道更快。此外,这仍然是一个两个语句的过程。
VAR3=${VAR1#/}               # Remove optional leading slash
VAR3=${VAR3%/}               # Remove optional trailing slash
echo ${VAR3}