在bash-joining参数替换中修剪尾随斜杠和前导斜杠?
我试图在bash中从字符串的开头和结尾修剪一个可能的在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
/
我可以通过以下方式实现这一点:
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}