使用sed替换路径的最后一个单词

时间:2010-05-30 07:43:57

标签: sed

我有以下内容:param="/var/tmp/test" 我需要将test替换为new_test

等其他词

需要一种聪明的方法来用“/”替换“/”之后的最后一个单词

5 个答案:

答案 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说的那样,如果可以,请使用basenamedirname)但至少你不需要过多的如果您要使用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 ... basenamedirname是汇编或反汇编路径名的更好选择。所有这些逃脱字符让我头疼......

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"