我有以下代码:
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