linux - sed 命令不接受 ksh 中带有 '.' 的子字符串

标签 linux sed ksh

我正在编写一个 ksh 脚本,该脚本将包含 @sys 子字符串的路径变量处理为其相应的操作系统名称:

如果build_type是64位版本,我们需要在osver末尾附加.64

例如如果 opsys=amd64_linux26_rh5(Red Hat Enterprise Linux 5) 和 build_type=dbg64osver 应为 amd64_linux26_rh5.64

现在,我想将 file_path 变量中存在的 @sys 替换为其相应的操作系统版本作为子字符串,即 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 的适当方法。

最佳答案

当输出显示时

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 不会在字符串 /xxx/xxx/xxx/amd64_linux26_rh5/xxx 中找到 @sys,并且 old_string 保持不变。

关于linux - sed 命令不接受 ksh 中带有 '.' 的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43616049/

相关文章:

linux - 删除非数值 - Unix

regex - 排除正则表达式匹配中的字符串,以进行 sed 处理

linux - 命令在命令行和脚本文件中产生不同的结果

linux - postgresql 不随 Linux 启动

linux - shell脚本linux减去参数grep

linux - 在哪里可以找到 "universal"Linux 二进制文件的列表?

linux - 使用 SED 命令中的变量选择两个模式之间的线

linux - Shell 脚本以及如何避免在 Linux 机器上同时运行相同的脚本

linux - ksh + 比较数字 – 两种方式

java - 安装 RPM 时出现包冲突错误