在 bash 中,从变量中删除最后一个字符

在 bash 中,从变量中删除最后一个字符

我有以下代码:

testval="aaa_bbb_ccc," 
testval+="_ddd"
echo ${testval}

但是,我需要去掉“之后的逗号”ccc${testval}“。在我添加“之前,它始终是最后一个字符_ddd"。字符串中可能还需要保留其他逗号。

但到目前为止我找不到任何有效的东西。

例如

testval="aaa_bbb_ccc," ; 
testval=${testval} | rev | cut -c 2- | rev ; testval+="_ddd" ; 
echo ${testval}

或者

testval="aaa_bbb_ccc," ; 
testval=${testval} | sed 's/.$//' ; testval+="_ddd" ; 
echo ${testval}

两者都会导致:

aaa_bbb_ccc,_ddd

我也尝试过:

testval="aaa_bbb_ccc," ; 
testval=$(${testval} | rev | cut -c 2- | rev) ; 
testval+="_ddd" ; 
echo ${testval}`

testval="aaa_bbb_ccc," ; 
testval=$(${testval} | sed 's/.$//') ; 
testval+="_ddd" ; 
echo ${testval}

两者都会导致:

-su: {testval}: command not found**

难道没有等价或rtrim类似的功能吗?这只是修剪最后一个n字符串/变量中的字符

答案1

是否没有类似函数的等价或 rtrim ?只是从字符串/变量中删除最后 n 个字符

就在这里:

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.

%形式删除最短的匹配,而%%删除最长的匹配。相应的“ltrim”是${parameter#word}${parameter##word}

例如

$ testval="aaa_bbb_ccc,"
$ testval=${testval%,}
$ echo ${testval}
aaa_bbb_ccc

对于你的情况

$ testval="aaa_bbb_ccc,"
$ testval=${testval%,}
$ testval+="_ddd"
$ echo ${testval}
aaa_bbb_ccc_ddd

您可以更改,?删除任何单个字符;或用于???替换 n=3 尾随字符等。在 bash 中,如果设置了 shell 选项,word则可以是 KSH 样式的扩展 glob 模式。extglob

答案2

初始字符串中只有一个逗号,因此最好在一次替换操作中执行此操作,而不是删除最后一个字符然后添加_ddd.例如

$ testval="aaa_bbb_ccc," 
$ testval="${testval/%,/_ddd}"
$ echo $testval
aaa_bbb_ccc_ddd

因为该模式以%bash 开头,尝试匹配逗号,但是仅有的如果它位于结尾字符串的。比较两者之间的差异(并注意 ,我用来替换原始字符串中的_后面):aaa

$ testval="aaa,bbb_ccc,"
$ testval="${testval/%,/_ddd}"
$ echo $testval
aaa,bbb_ccc_ddd

而这个,没有%

$ testval="aaa_,bbb_ccc,"
$ testval="${testval/,/_ddd}"
$ echo $testval
aaa__dddbbb_ccc,

答案3

你的问题里已经有了答案。您所要做的就是echo在 ${testval}` 之前添加

testval="aaa_bbb_ccc," ; testval=$(echo ${testval} | sed 's/.$//') ; testval+="_ddd" ; echo ${testval}
aaa_bbb_ccc_ddd

答案4

您可以使用awk

testval="aaa_bbb_ccc,"
testval=$(echo $testval| awk '{sub(/.$/,"",$0);print $0"_ddd"}')

结果输出:

aaa_bbb_ccc_ddd

相关内容