【问题标题】:sed command not accepting sub-string with '.' in kshsed 命令不接受带有 '.' 的子字符串在 ksh
【发布时间】:2017-04-25 16:19:52
【问题描述】:

我正在编写一个 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 的适当方式。

【问题讨论】:

  • 我得到了不同的输出。
  • @choroba,你能分享一下输出吗?
  • osver: amd64_linux26_rh5.64 \n old file_path is : /xxx/xxx/xxx/@sys/xxx \n new file_path is : /xxx/xxx/xxx/amd64_linux26_rh5.64/xxx.
  • @choroba,我认为它是 parameter interpolation of ksh
  • 我复制了包含shebang行的脚本,所以这里也是ksh。

标签: linux sed ksh


【解决方案1】:

当输出显示时

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 保持不变。

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 2020-08-26
    • 2017-11-29
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多