Sed 命令使用正则表达式中的硬编码值运行,但由于脚本中的变量而失败

Sed 命令使用正则表达式中的硬编码值运行,但由于脚本中的变量而失败

我的文件数据模式如下,我需要根据变量值 eth0 和 eth1 输出 6 或 3 或 8 或 4

eth0RX:6:eth0TX:3|eth1RX:8:eth1TX:4|

下面的代码运行良好

sed 's/.*eth0RX:\([0-9]\+\).*/\1/g' $EMSTATE/packetdrop.txt

但是当我使用像下面这样的动态变量时会失败

rxfile=sed 's/.*$iRX:\([0-9]\+\).*/\1/g' $EMSTATE/packetdrop.txt

答案1

  1. 在单引号内,一切都是这样。  $i是一个美元符号,后跟一个i。如果你想使用变量,你必须将字符串放入双引号中,有点像这样:
    “s/.*$iRX:\([0-9]\+\).*/\1/g”
  2. 但这是行不通的,因为它会寻找一个名为 的变量iRX。解决这个问题的最简单方法是将变量名称放在大括号中,如下所示:
    "s/.*${i}RX:\([0-9]\+\).*/\1/g"
  3. $EMSTATE也应该放入双引号。您可以使用"$EMSTATE"/packetdrop.txt"$EMSTATE/packetdrop.txt",无论您喜欢哪个。

答案2

单引号中不会发生变量扩展。请改用双引号。如果要将结果设置为变量,则需要sed在命令替换语法中运行$(...),并且最好也引用它"$(...)"。另外 as$iRX可以是一个有效的变量名,最好这样做${i}

rxfile="$(sed "s/.*${i}RX:\([0-9]\+\).*/\1/g" "$EMSTATE/packetdrop.txt" )"

相关内容