私は私のために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
パラメーターを使用すると、-i
sedコマンドはファイルをその場所で編集します。.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!
が変更されました。
警告する:
sed -i'.bak'
使用時と間にスペースがないことを確認してください。-i
.bak
$params
変数になどの特殊文字が含まれている\
とコマンドは失敗する/
ため、プレフィックスを追加してこれらの文字をエスケープする必要があります。たとえば、値を渡すにはを使用する必要があります。&
sed
\
'fuzz&'
'fuzz\&'
- 文字列を渡すときは、二重引用符の代わりに一重
script.sh
引用符を使用する必要があります。使用する場合は、文字列に対応する文字(バックティック)が含まれているか、プレフィックスを使用して文字をエスケープする必要があります。'
"
"
`
\
\
./script.sh "fuzz\`" # "fuzz\`" will be "fuzz`"
#or
./script.sh "fuzz\\\\" # "fuzz\\\\" will be "fuzz\"
観察してくれたFrabjousとPhilipposに感謝します。