我有一个包含完整路径名的变量。我试图有条件地替换路径中最后出现的一个单词。演示我正在尝试的示例脚本

#!/bin/sh

testvar="/home/downloads/user/downloads"

if [ "$1" = "alternate" ]; then
  newtestvar=$(echo $testvar | sed -e 's/\(.*\)downloads$/\1alternate_downloads/g')
else
  newtestvar=$(echo $testvar | sed -e 's/\(.*\)downloads$/\1new_downloads/g')
fi

echo "testvar:" $testvar
echo "newtestvar:" $newtestvar

运行#1
$ ./foofile
testvar: /home/downloads/user/downloads
newtestvar: /home/downloads/user/new_downloads

运行#2
$ ./foofile alternate
testvar: /home/downloads/user/downloads
newtestvar: /home/downloads/user/alternate_downloads

我确实得到了预期的结果,但是我正在寻找一种避免if/else的方法,而是通过在sed的上下文中检查$1来实现结果。
编辑-1
我用下面的速记替换了if/else块。但它看起来真的很笨拙而且很难阅读。
newtestvar=$([[ $1 = "alternate" ]] && echo $testvar | sed -e 's/\(.*\)downloads$/\1alternate_downloads/g' || echo $testvar | sed -e 's/\(.*\)downloads$/\1new_downloads/g')

最佳答案

这可能无法使用sed完成,因为sed无法测试变量的值,然后有条件地分支执行。
但是,可以使用AWK:

#!/bin/sh

testvar="/home/downloads/user/downloads"

newtestvar=$(awk -v arg="$1" '{
    replacement = arg == "alternate" ? "alternate_downloads" : "new_downloads";
    sub("downloads$", replacement);
    print $0;
  }
' <<<"$testvar")

echo "testvar:" $testvar
echo "newtestvar:" $newtestvar

07-26 09:29
查看更多