人が維持する次のJavaプロパティファイルがあります。
# file.input = /very/old/name
# file.input = /old/name
file.input = /current/name
file.input.default = /default/name
other.file.input = /current/other/name
# Other comments
other.properties = must stay the same
他のファイルに触れることなくこのファイルを編集するには、スクリプトを作成する必要があります。したがって、構成ファイルに新しい属性をダンプすることはできません。
多くの場合、人々は後で使用するために1行をコピー/貼り付けてコメントを付けます。私のアプリケーションは、コメントに触れることなく設定ファイルを具体的に編集する必要があります。
この特別な場合は、コメント行に触れることなく他のプロパティ(、、)に触れることなくfile.input
値をに設定するように行を編集したいと思います。私のスクリプトは、人間が通常やっているように、歴史的目的のために現在の行を維持しません。また、keyに設定されている現在の値がわかりません。/new/name
file.input.default
other.file.input
file.input
私はどこに閉じ込められていますか?最初は。私はBashの専門家ではなく、コマンドを順番に呼び出し、時にはいくつかのifを使用する以外はほとんど使用しません。しかし、それはすべてです。
perl
正規表現を使用できますが、このシステムにはPerlがインストールされていないようです。それで、順番に順番に振り返りますが、sed
何の結果も得られません。特定の値を他の値にのみ置き換えることができるようです。ファイルの読み取りでラップし、変更できる意図した行を除いて書き換えることができます。しかも変えたい家の前に人為的に追加された空間も到底余裕がなかった。
したがって、他のオプションがある場合は共有してください。私が遠ざかり始めたからです。
答え1
sed
-iオプションを使用します(所定の位置で編集)。警告は、置換コマンドを区切るために使用される文字がNEW文字列には表示されないことです。この例では、 '/'の代わりに ':'を使用して(s:old_string:new_string:
)を区切ります。
NEW=/new/name
sed -i 's:^[ \t]*file.input[ \t]*=\([ \t]*.*\)$:file.input = '${NEW}':' f
答え2
ソリューション用途awk
:
$ awk -F'=' '$1 ~ /^[ \t]*file.input[ \t]*$/{$2="= /new/name"}{print}' config
# file.input = /very/old/name
# file.input = /old/name
file.input = /new/name
file.input.default = /default/name
other.file.input = /current/other/name
# Other comments
other.properties = must stay the same
その後、新しい設定ファイルに保存できます。
awk -F'=' '$1 ~ /^\s*file.input\s*$/{$2="= /new/name"}{print > "new_config"}' config
答え3
クロスプラットフォームで作業するためにスクリプトでそれを使用する必要がある場合(MacOSXでも動作します)、-i
バックアップファイル拡張子を提供するフルフラグを使用する必要があります。
NEW=/new/thing
sed -i.backup 's|\s*file.input\s*=.*$|file.input = '${NEW}'|' filename
## Then you can check exit code and remove the backup file if all is well
## rm filename.backup
それ以外の場合、MacOSX では「コマンドの末尾に余分な文字があります」などのエラーが発生します。