sed コマンドは、構成ファイルの値をオーバーライドします。

sed コマンドは、構成ファイルの値をオーバーライドします。

自動化スクリプトを作成していますが、構成ファイルの値を変更する必要があります。編集する構成ファイルには、次の行があります(前のスペースを含む)。

    "peer-port": 23456,

234565桁の数字にすることができます。私が作成しているスクリプトには、という変数に保存されている新しいポートが渡されます$newportsed(またはawk)コマンドを使用して置き換える方法「23456」、(または何でも)新しいポート値は変数に含まれます$newport

比較的完全なものサンプル構成ファイルは次のとおりです。

{
    "alt-speed-down": 50, 
    "alt-speed-enabled": false, 
    "alt-speed-time-begin": 540, 
    "alt-speed-time-day": 127, 
    "alt-speed-time-enabled": false, 
    "alt-speed-time-end": 1020, 
    "alt-speed-up": 50, 
    "bind-address-ipv4": "0.0.0.0", 
    "bind-address-ipv6": "::", 
    "blocklist-enabled": false, 
    "blocklist-url": "http://www.example.com/blocklist", 
    "cache-size-mb": 2, 
    "dht-enabled": true, 
    "download-dir": "/var/media/orng/dl/", 
    "download-queue-enabled": true, 
    "download-queue-size": 1, 
    "encryption": 2, 
    "idle-seeding-limit": 30, 
    "idle-seeding-limit-enabled": false, 
    "incomplete-dir": "/var/media/orng/dl//incoming", 
    "incomplete-dir-enabled": true, 
    "lpd-enabled": false, 
    "message-level": 2, 
    "peer-congestion-algorithm": "", 
    "peer-limit-global": 100, 
    "peer-limit-per-torrent": 20, 
    "peer-port": 51413, 
    "peer-port-random-high": 65535, 
    "peer-port-random-low": 49152, 
    "peer-port-random-on-start": false, 
    "peer-socket-tos": "default", 
    "pex-enabled": true, 
    "port-forwarding-enabled": true, 
    "preallocation": 1, 
    "prefetch-enabled": 0, 
    "queue-stalled-enabled": true, 
    "queue-stalled-minutes": 30, 
    "ratio-limit": 0, 
    "ratio-limit-enabled": true, 
    "rename-partial-files": true, 
    "rpc-authentication-required": false, 
    "rpc-bind-address": "0.0.0.0", 
    "rpc-enabled": true, 
    "rpc-password": "{43041796ac49801e85577ba94a0e4ee5642d53a6soamZcAy", 
    "rpc-port": 9091, 
    "rpc-url": "/transmission/", 
    "rpc-username": "", 
    "rpc-whitelist": "127.0.0.1, 192.168.1.*", 
    "rpc-whitelist-enabled": true, 
    "scrape-paused-torrents-enabled": true, 
    "script-torrent-done-enabled": false, 
    "script-torrent-done-filename": "", 
    "seed-queue-enabled": false, 
    "seed-queue-size": 10, 
    "speed-limit-down": 100, 
    "speed-limit-down-enabled": false, 
    "speed-limit-up": 100, 
    "speed-limit-up-enabled": false, 
    "start-added-torrents": true, 
    "trash-original-torrent-files": false, 
    "umask": 18, 
    "upload-slots-per-torrent": 14, 
    "utp-enabled": true, 
    "watch-dir": "/var/media/orng/dl//watch", 
    "watch-dir-enabled": true
}

答え1

jq --argjson port "$newport" '."peer-port" |= $port' file.json >file-new.json

file-new.jsonこれにより、キーpeer-port値がシェル変数値に変更された新しいファイルが作成されます$newport。シェル変数はそのまま、つまりエンコードなしで挿入されるので、純粋な整数であることを確認してください(エンコードされた文字列として挿入する--arg代わりに使用)。--argjson

答え2

次のテストを試してください。

sed 's/^    "peer-port": [0-9]*,/    "peer-port": '"${newport}"',/' settings.json

...出力を確認して大丈夫に見える場合は、-i次のように実際にファイルを変更するために1つを追加してください。

sed -i 's/^    "peer-port": [0-9]*,/    "peer-port": '"${newport}"',/' settings.json

メモ:sデリゲート文字列に若干の調整が必要な場合があります。 (つまりスペースがスペースかタブかによって、" "を" ")に置き換えます。\t

よりコンパクトで効率的な(しかし移植性が低い)アプローチ:

sed `/^    "peer-port": /{s/ [0-9]*,/ '"${newport}",'/;q}' settings.json

答え3

通常、sed検索文字列のパターンを生成するために文字列全体を必要とせず、一意の部分だけが必要です。この場合、小さな尾を持つキーワードを見つけて一連の数字を見つけ、すべてを変更されていない最初の項目(\ 1)に置き換え、2番目の項目をスクリプトの文字列に置き換えます。

#!/bin/bash

FNAME=$1
NPORT=$2
SSTR='{s/(peer-port.+) ([0-9]+)/\1 '$NPORT'/};'
echo "new port $NPORT in $FNAME"

sed -E -i -e "$SSTR" $FNAME

答え4

入れ子になったデータ型(jsonなど)を解析するには、対応する(json型認識)ユーティリティを使用して実行する必要があります。sed私だけ知っているラインだ。以下は、walk-path unixユーティリティに基づく単純なソリューションです。jtc:

bash $ newport=12345
bash $ jtc -w[peer-port] -u"$newport" -f file.json 
bash $ jtc -w[peer-port] file.json 
12345
bash $ 

関連情報