在shell中查找字符串并修改字符串后的内容

jmp7cifd  于 2023-04-21  发布在  Shell
关注(0)|答案(1)|浏览(135)

我在shell中有一个变量

vpp_dpdk_dev_conf="dev='name=a,pci=2,mtu=1400,num-rx-queues=64,num-tx-queues=64,num-rx-desc=8,num-tx-desc=8,skip=false|true

现在我有另一个文件,其中pci将目前,作为一个样本

pci 2 {
        num-rx-queues 30
        num-tx-queues 17
}

现在,如果我的pci值存在,那么我需要用当前的env变量替换当前的任何值,如果不存在,则添加它们。
现在这个pci可以有多个示例,但需要替换哪个匹配pci x
我正在解析整个字符串并删除“=”,因为在最终文件中它不会出现。

function conf_file_update()
{
    for param in $@
        do
            name=${param%%=*}
            value=${param#*=}
            echo "value final" $value
            if [ "$name" == "pci" ]; then
               named_param="$name $value"
               VAR=$(grep -n "${named_param}" $CONF_FILE_PATH | cut -d : -f 1)
               VAR=$(($VAR+1))
               echo $VAR
                sed -i '$VAR,$s/^        '"${name}"' [0-9]*/        '"${name}"' '"${value}"'/' $CONF_FILE_PATH
            fi
    done
}
read ra DEV <<< $vpp_dpdk_dev_conf
for i in "${DEV[@]}"; do
    #if [[ -f $i ]] && [[ -w $i ]]; then
    for param in $(IFS='=';echo $i); do
        echo $i
        name=${param%% *}
        value=${param#* }
        if [ "$name" == "pci" ]; then
             conf_file_update $DEV
             exit 0

在sed命令中,我试图传递应该开始替换的行号,但sed没有接受$VAR并说
未知命令:V字
任何建议的方法在这个问题是高度赞赏。谢谢Niladri

tgabmvqs

tgabmvqs1#

$VAR和所有sed表达式放在"(而不是')之间。

sed -i '$VAR,$s/^        '"${name}"' [0-9]*/        '"${name}"' '"${value}"'/' $CONF_FILE_PATH

其中:

sed -i "$VAR,\$s/^        ${name} [0-9]*/        ${name} ${value}/" "$CONF_FILE_PATH"

相关问题