私はこのようなファイルを持っています:
[User1] <- unique id
name= <- values can be empty
pwd=
...
<- empty line
[User2]
name=
pwd=
..
[User3]
name=
pwd=
..
フィールド値を変更するためのフィールド値を取得する能力が必要ですUser2
(例pwd
)。
PS bash、sed、またはawkを使用することをお勧めします
pwdの値を変更する簡単な解決策は次のとおりです。これにより、が最後のフィールドである場合、レコードの最後に改行が追加されますpwd
。
awk '/^\[User2\]/ { sub( "\npwd=[^\n]*(\n|$)",
"\npwd=newvalue\n") } 1' ORS='\n\n' RS= input-file > output-file
mv output-file > input-file
このような3つのルールでそれを行うことができます(nawk互換):
awk -F= '
/^\[/ { user=$1; gsub("[][]","",user) }
user == "User2" && $1 == "pwd" { $0=$1"=some_pwd" }
1
'
出力:
[User1]
name=
pwd=
...
[User2]
name=
pwd=some_pwd
..
[User3]
name=
pwd=
..
Pythonにはこの種の問題のための組み込みモジュールが付属しているため、これはPythonとAWKの明らかな勝利です。
モジュールの名前がPython2.xからPython3.xに変更されました。上部のtry
ブロックは、これがPython2.xまたはPython3.xのいずれかで機能することを可能にするはずです(そして私は自分のコンピューターで両方でテストしました)。
編集:私は答えを少し改善しました。これで、新しいファイルを書き込む代わりに、一時ファイルが書き込まれ、正常に完了すると、元のファイルが削除され、一時ファイルの名前が元のファイル名に変更されます。Windows以外のシステムでは、元のファイルを削除する手順はオプションです。
import os
import sys
try:
import ConfigParser as cp
except ImportError:
import configparser as cp
try:
_, fname = sys.argv
except Exception:
print("Usage: configedit <filename>")
temp_file = fname + ".tempfile"
c = cp.ConfigParser()
c.read(fname)
c.set("User2", "pwd", "XkcdApprovedLongerPassword")
with open(temp_file, "w") as f:
c.write(f)
os.remove(fname)
os.rename(temp_file, fname)
sed経由で要求された場合:
sed -i "/\[User2\]/,/^$/{s/\(^pwd\)\=.*$/\1\=password/}"
上記の行の「password」を、ファイル内でパスワードを変更したいものに変更します。
このスクリプトは、「[User2]」と次の空白行の間を検索します。次に、「pwd =」で始まる行を検索し、その後で何かを変更します。
よく見る人のために、私はリクエスターの読みやすさのために「=」記号をキャプチャしませんでした。