gpt4 book ai didi

bash - 用 sed 检查 $1 以有条件地替换路径字符串中最后一次出现的单词

转载 作者:行者123 更新时间:2023-11-29 09:50:56 25 4
gpt4 key购买 nike

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

#!/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 block 。但它看起来非常笨拙且难以阅读。

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

最佳答案

您可以避免 sed 并在 bash 本身中处理它:

#!/bin/bash

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

# default s to "new"
s="${1:-new}"

# replace only last value of downloads
newtestvar="${testvar/%downloads/${s}_downloads}"

# examine both variables
declare -p testvar newtestvar

现在称它为:

./foofile
declare -- testvar="/home/downloads/user/downloads"
declare -- newtestvar="/home/downloads/user/new_downloads"

./foofile alternate
declare -- testvar="/home/downloads/user/downloads"
declare -- newtestvar="/home/downloads/user/alternate_downloads"

关于bash - 用 sed 检查 $1 以有条件地替换路径字符串中最后一次出现的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44672532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com