さまざまな構成ファイルの$placeholderテキストを$placeholderパラメーターに置き換える

さまざまな構成ファイルの$placeholderテキストを$placeholderパラメーターに置き換える

私は私のためにsedを保存​​しようとしており、愚かなように感じます。それで、誰かが非常に簡単に見えることを達成するためのより賢明な方法を持っていることを願っています。

ファイル.conf:

USER: !USER!

スクリプト.sh:

param=$1
# something to replace !USER! with $param

file.confを実行した後script.sh squirrel

USER: squirrel

答え1

このsedコマンドを使用してこれを達成できます。あなたが持っているとしましょうfile.conf

USER: !USER!
USER: !USER2!
USER: !USER
USER: !USER!

ファイルにはscript.sh以下が必要です。

#! /bin/bash

param=$1

sed -i'.bak' "s/\!USER\!/$param/" /path/to/file.conf

パラメーターを使用すると、-isedコマンドはファイルをその場所で編集します。.bakはファイルのバックアップなので、ファイルがあればそのfile.confバックアップはですfile.conf.bak

ある値を別の値に置き換えるために使用されます"s/\!USER\!/$param/"。たとえば、sedは、コマンドラインで指定された文字列が$ paramに含まれる文字列を置き換える\!USER\!/$paramという意味です。!USER!$param

script.sh最後に実行すると、変更された内容が表示さ./script.sh squirrelれます。file.conf出力は次のとおりです。

USER: squirrel
USER: !USER2!
USER: !USER
USER: squirrel

ご覧のとおり、最初の行と最後の行のみ!USER!が変更されました。

警告する:

  1. sed -i'.bak'使用時と間にスペースがないことを確認してください。-i.bak
  2. $params変数になどの特殊文字が含まれている\とコマンドは失敗する/ため、プレフィックスを追加してこれらの文字をエスケープする必要があります。たとえば、値を渡すにはを使用する必要があります。&sed\'fuzz&''fuzz\&'
  3. 文字列を渡すときは、二重引用符の代わりに一重script.sh引用符を使用する必要があります。使用する場合は、文字列に対応する文字(バックティック)が含まれているか、プレフィックスを使用して文字をエスケープする必要があります。'""`\\
./script.sh "fuzz\`" # "fuzz\`" will be "fuzz`"
#or
./script.sh "fuzz\\\\" # "fuzz\\\\" will be "fuzz\"

観察してくれたFrabjousとPhilipposに感謝します。

関連情報