Shell变量末尾字符串替换问题求助:替换risk为risk_unzip
解决Shell变量路径末尾字符串替换的问题
你用tr命令没成功是因为**tr是字符替换工具,不是字符串替换工具**——它只会逐个替换字符,而不是匹配整个字符串。比如你写的tr 'risk' 'risk_unzip',其实是把'r'换成'r'、'i'换成'i'、's'换成's'、'k'换成'k',后面的_unzip根本不会起作用,自然达不到替换末尾risk的目的。
下面给你几种高效的解决方案:
方案1:Shell内置参数扩展(推荐,无需外部命令)
这是最简洁高效的方法,利用Shell本身的变量处理能力:
input="/local/1/hadoop/MISDATA1/Risk_Analytics/blocker/risk/" # 从末尾删除最短匹配的"risk/",再拼接目标字符串 output="${input%risk/}risk_unzip/" echo "$output"
解释:${input%pattern}是Shell的参数扩展语法,意思是从变量input的末尾开始,删除最短匹配pattern的部分。这里我们匹配末尾的risk/,删掉后再加上risk_unzip/,正好得到你想要的路径。
如果不确定原路径末尾是否有斜杠,可以先统一处理:
input="/local/1/hadoop/MISDATA1/Risk_Analytics/blocker/risk/" # 先去掉末尾的斜杠(如果存在) input_clean="${input%/}" # 替换最后一段的"risk"为"risk_unzip",再加回斜杠 output="${input_clean%risk}risk_unzip/" echo "$output"
方案2:用sed做正则替换
如果习惯用文本处理工具,可以用sed匹配末尾的字符串并替换:
input="/local/1/hadoop/MISDATA1/Risk_Analytics/blocker/risk/" output=$(echo "$input" | sed 's|risk/$|risk_unzip/|') echo "$output"
解释:sed的s|原字符串|新字符串|是替换命令,这里用|作为分隔符(避免和路径里的/冲突),risk/$表示匹配行尾的risk/,替换成risk_unzip/。
方案3:用awk分割路径处理(备选)
这种方法适合更复杂的路径分割场景,但相对繁琐:
input="/local/1/hadoop/MISDATA1/Risk_Analytics/blocker/risk/" output=$(echo "$input" | awk -F'/' '{ for(i=1; i<NF-1; i++) printf "%s/", $i printf "risk_unzip/\n" }') echo "$output"
解释:用/作为分隔符分割路径,循环输出除最后一段外的所有部分,再拼接目标路径段。
内容的提问来源于stack exchange,提问作者Teju Priya
相关产品推荐
相关产品推荐

