【问题标题】:Bash Script to update file progrmatically [closed]以编程方式更新文件的 Bash 脚本 [关闭]
【发布时间】:2020-09-22 15:29:59
【问题描述】:

我有一个包含这样内容的文件

    adv_dir=2
    ami_pro=3

我有一个变量$TEMP 的值为ami_pro,我想将$TEMP 的值增加1。

为此需要一个 bash 脚本。 更新后的文件状态

    adv_dir=2
    ami_pro=4

【问题讨论】:

标签: bash terminal


【解决方案1】:

Icky-ish,诡异的间接,但是...

$: echo $TEMP
ami_pro
$: echo $ami_pro
4
$: (($TEMP++))  # $TEMP evals to ami_pro, which gets incremented
$: echo $TEMP
ami_pro
$: echo $ami_pro
5
$: let $TEMP++  # same, likely in any arithmetic context
$: echo $ami_pro
6

所以...

TEMP=ami_pro                     # just setting in the env
grep "$TEMP=" file > $TEMP.tmp   # grap the line we need to edit
. $TEMP.tmp                      # souce it to set the var
sed -i "s/$TEMP=${!TEMP}/$TEMP=$((++$TEMP))/" file # in-place edit

你可以用eval "$(grep "$TEMP=" file)" 跳过临时文件,但eval 让我很痒。

sed 是对file 的就地编辑,使用双引号 允许操作系统在进行更新之前预处理变量。

TEMP=ami_pro

所以

$TEMP=${!TEMP}

被操作系统解析成

ami_pro=$ami_pro

由于我们获取了表示ami_pro=3 的行,因此会进一步解析为

ami_pro=3

然后

$TEMP=$((++$TEMP))

变成ami_pro=$((++ami_pro)) 处理到

ami_pro=4

所有sed得到的是结果字符串,所以当sed开始解析时,它看到的是

s/ami_pro=3/ami_pro=4/ 

处理完编辑后,我们就可以跳出循环了。

【讨论】:

    【解决方案2】:

    您可以为此使用awk

    #!/bin/bash
    
    TMP_FILE=$(mktemp)
    awk -F= "/^${TEMP}=/ {print \$1 \"=\" \$2 + 1 \"*\"; next} 1" "${1}" > ${TMP_FILE} && mv ${TMP_FILE} "${1}"
    rm ${TMP_FILE}
    

    将带有数据的文件作为参数传递给此脚本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 2014-07-17
      • 2015-03-27
      • 1970-01-01
      • 2020-01-07
      • 2012-05-04
      • 1970-01-01
      相关资源
      最近更新 更多