3

私はこのようなファイルを持っています:

[User1]  <- unique id
name=    <- values can be empty
pwd=
...
         <- empty line
[User2]
name=
pwd=
..

[User3]
name=
pwd=
..

フィールド値を変更するためのフィールド値を取得する能力が必要ですUser2 (例pwd)。

PS bashsed、またはawkを使用することをお勧めします

4

4 に答える 4

2

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
于 2013-02-20T22:00:03.557 に答える
2

このような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=
..
于 2013-02-20T22:16:08.047 に答える
1

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)
于 2013-02-20T22:15:49.533 に答える
0

sed経由で要求された場合:

sed -i "/\[User2\]/,/^$/{s/\(^pwd\)\=.*$/\1\=password/}"

上記の行の「password」を、ファイル内でパスワードを変更したいものに変更します。

このスクリプトは、「[User2]」と次の空白行の間を検索します。次に、「pwd =」で始まる行を検索し、その後で何かを変更します。

よく見る人のために、私はリクエスターの読みやすさのために「=」記号をキャプチャしませんでした。

于 2016-04-29T20:47:45.597 に答える