私はsudoers、sysctl.confなどに行を追加するために多くの一時スクリプトを書いています。通常、私はlineinfile ansibleモジュールを使用します。しかし、時にはこれを行うことができないので、次を使用します。
WHAT_I_WANT='my line of text = something'
WHAT_TO_REPLACE='my line of text = .*'
FILE_TO_EDIT=conf_file.conf
if ( ! grep -q "^$WHAT_I_WANT\$" FILE_TO_EDIT ); then
echo "$WHAT_I_WANT" >> FILE_TO_EDIT
else
sed -i "s/$WHAT_TO_REPLACE/$WHAT_I_WANT/g' FILE_TO_EDIT
fi
私の考えには、これを行うより効率的な方法があるようです。理想的には、1行と1言語を使用することをお勧めします(正規表現の一致、コメント化された行の削除、およびファイルのバックアップを許可する方法で)。しかし、それが何であるかはわかりません。
ベストアンサー1
- 私の考えでは、長い文字列を置き換えるために非常に長い変数名を使用するのは非生産的です。
- grep/sed コマンドで変数を拡張するには、二重引用符を使用します。
.*
変数の割り当てにワイルドカード文字を使用すると、ファイル名拡張子の実行(ワイルドカード)- 次のスクリプトは、ifの代わりに
&&
成功または失敗時に条件付き実行を使用します。||
REPL='something'
PATT='my line of text = '
FILE=conf_file.conf
cat $FILE
echo '========='
grep -q "^$PATT" $FILE && (sed -i "s/^$PATT.*$/$PATT$REPL/" $FILE) || (echo "$PATT$REPL" >> $FILE)
cat $FILE