我有以下内容:param="/var/tmp/test"
我需要将test
替换为new_test
需要一种聪明的方法来用“/”替换“/”之后的最后一个单词
答案 0 :(得分:3)
echo 'param="/var/tmp/test"' | sed 's/\/[^\/]*"/\/REPLACEMENT"/'
param="/var/tmp/REPLACEMENT"
echo '/var/tmp/test' | sed 's/\/[^\/]*$/\/REPLACEMENT/'
/var/tmp/REPLACEMENT
答案 1 :(得分:1)
用sed
提取点点滴滴有点乱(正如Jim Lewis说的那样,如果可以,请使用basename
和dirname
)但至少你不需要过多的如果您要使用sed
路由,则可以使用反斜杠,因为您可以使用分隔符可选的事实(当!
太笨拙时,我喜欢使用/
,但它是任意的):
$ echo 'param="/var/tmp/test"' | sed ' s!/[^/"]*"!/new_test"! '
param="/var/tmp/new_test"
我们也可以只提取被替换的部分,但在sed
控制脚本中使用两个替换更容易:
$ echo 'param="/var/tmp/test"' | sed ' s!.*/!! ; s/"$// '
test
答案 2 :(得分:0)
您不需要sed
... basename
和dirname
是汇编或反汇编路径名的更好选择。所有这些逃脱字符让我头疼......
param="/var/tmp/test"
param_repl=`dirname $param`/newtest
答案 3 :(得分:0)
目前尚不清楚param
是否是您需要处理的字符串的一部分,或者它是保存字符串的变量。假设后者,你可以只使用Bash(你不说你正在使用哪个shell):
shopt -s extglob
param="/var/tmp/test"
param="${param/%\/*([^\/])//new_test}"
如果param=
是字符串的一部分:
shopt -s extglob
string='param="/var/tmp/test"'
string="${string/%\/*([^\/])\"//new}"
答案 4 :(得分:0)
这可能对您有用:
echo 'param="/var/tmp/test"' | sed -r 's#(/(([^/]*/)*))[^"]*#\1newtest#'
param="/var/tmp/newtest"