我正在编写一个ksh脚本,它将包含@sys
子字符串的路径变量处理为相应的操作系统名称:
如果build_type
是64位版本,我们需要在.64
的末尾添加osver
。
e.g。如果opsys=amd64_linux26_rh5
(红帽企业Linux 5)和build_type=dbg64
,osver
应为amd64_linux26_rh5.64
。
现在,我想将@sys
变量中的file_path
替换为相应的操作系统版本作为子字符串,即amd64_linux26_rh5.64
。
但看起来sed
忽略了。不知何故,唯一的amd64_linux26_rh5
正在取代@sys
省略.64
部分。
#!/bin/ksh
file_path="/xxx/xxx/xxx/@sys/xxx"
sys="@sys"
bld_type="dbg64"
opsys="amd64_linux26_rh5"
bitver=".64"
if [[ ${bld_type} = @(*64) ]]
then
osver="${opsys}${bitver}"
fi
echo "osver: $osver"
echo "old file_path is : $file_path"
file_path=$(echo "$file_path" | sed "s/$sys/${osver}/")
echo "new file_path is : $file_path"
相应的输出:
osver: amd64_linux26_rh5.64
old file_path is : /xxx/xxx/xxx/amd64_linux26_rh5/xxx
new file_path is : /xxx/xxx/xxx/amd64_linux26_rh5/xxx
我们正在尝试将file_path
更改为/xxx/xxx/xxx/amd64_linux26_rh5.64/xxx
。在这种情况下,请建议使用sed
的适当方式。
答案 0 :(得分:2)
输出显示时
old file_path is : /xxx/xxx/xxx/amd64_linux26_rh5/xxx
然后在复制粘贴代码时出现了问题
在您的代码中,file_path
设置为
file_path="/xxx/xxx/xxx/@sys/xxx"
并且在echo
之前永远不会更改。所以你的代码似乎与你展示的不同。
echo "old file_path is : $file_path"
输出是有意义的。
在你的sed命令中
file_path=$(echo "$file_path" | sed "s/$sys/${osver}/")
sed在字符串@sys
中找不到/xxx/xxx/xxx/amd64_linux26_rh5/xxx
,old_string
保持不变。