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コマンド代替構文で実行する必要があり、$(...)可能であれば引用符を付ける必要があります"$(...)"。また、$iRX有効な変数名にすることができますが、この方法が最適です${i}

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

関連情報