sed を検索してスラッシュに置き換える

sed を検索してスラッシュに置き換える

パラメータ内のスラッシュを見つけるためにsedを検索/置換するのに問題があります。

test.shのサンプルコンテンツ

str=$(sed -n '/^user:/p' /tmp/shadowtest) # find "user:" line in /etc/shadowtest
arr=(${str//:/ }) # explode str with : as delimeter
arr=${arr[1]} # grab the 2nd element
sed -i 's|$arr|XXXXX|g' /tmp/shadowtest # Nothing gets replaced in shadowtest

/tmp/shadowtestのサンプルコンテンツ

# junk here
user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
# junk here

スクリプトをそのまま実行すると、Shadowtestファイルのどれも置き換えられません。しかし、sedコマンドを次のように変更すると、

sed -i 's|99999|XXXXX|g' /tmp/shadowtest

良い結果。

答え1

$arrを置き換えるには、単一引用符の外に入れる必要があります。たとえば、

sed -i "s|$arr|XXXXX|g" /tmp/shadowtest

答え2

あなたのコードが何をしているのかを正しく理解したら、あなたの例では次のようになります。

$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0

次に交換する必要があります。

XXXXX

これが真であれば、シェルをまったく含める必要はありません。

sed '/^user:/s/:[^:]*/:XXXXX/
' <<\DATA
# junk here
user:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
user:different stuff in this spot:16310:0:99999:7:::
# junk here
DATA

出力

# junk here
user:XXXXX:16310:0:99999:7:::
other:$6$hcwp49Lr$BjcJYc/nwaufmsOIw4Tw/POaXO4j.0HDLU0:16310:0:99999:7:::
user:XXXXX:16310:0:99999:7:::
# junk here

文字列で始まる行だけを処理するという点で、ユーザー自身と同じように機能しますが(主に)その行で関数を実行する代わりに関数を実行しますuser:ps///

:XXXXX文字列で始まる行で、文字列の直後に続く文字ではなく、最初のシーケンスに文字列を置き換えます。::user:

関連情報