ペアを含むファイルを考えてみましょうkey=value
。それぞれはkey
複数の s の接続であってもよい。key
つまり、複数のkey
ものを1つにマッピングできますvalue
。その理由は、key
各単語が長さと比較して比較的短い単語であるため、value
データがより少ない数の行に「圧縮」されるからである。
例(つまり、実際の値ではありません):
$ cat testfile
AA,BB,CC=a-lengthy-value
A,B,C=a-very-long-value
D,E,F=another-very-long-value
K1,K2,K3=many-many-more
Z=more-long-value
すべてのkey
sが一意で、次の文字を含まないと仮定すると有効です。
key
分離記号:,
- キー値区切り記号:
=
- スペース文字:
key
sはどんな形でも現れます。未来(上記の制約により)今また、次の正規表現にも従います[[:upper:]]{2}[[:upper:]0-9]
。同様にvalue
、sは含まれていないので、=
各行=
を分割するために安全に使用できます。複数行も行key
もないvalue
ため、1行ずつ処理するのも安全です。
このファイルからデータを簡単に抽出するために、次getval()
の関数が定義されています。
getval() {
sed -n "/^\([^,]*,\)*$1\(,[^=]*\)*=\(.*\)$/{s//\3/p;q}" testfile
}
したがって、呼び出しは代わりにgetval A
値を返します。また、存在しない項目については何も返さないでください。a-very-long-value
a-lengthy-value
key
質問:
- 堅牢性の現在の定義で
getval()
十分ですか? - より短く、より表現的で、より制限的な他のデータ抽出方法はありますか?
とにかく、このスクリプトはcygwinで実行され、付属してbash
いcoreutils
ます。したがって、ここでは移植性は必要ありません(つまり、ボーナスポイントのみが提供されます)。ありがとうございます!
編集する:
機能が修正され、キーの説明が追加されました。
編集2:
書式(複数行なし)と移植性(要件ではない)に関する注意事項を追加しました。
答え1
以下を使用して、より読みやすい形式で作成できますawk
。
getval() {
awk -F'=' '$1~/\<'"$1"'\>/{print $2}' testfile
}
答え2
そしてsed
...
getval() { sed "/^\([^=]*,\)*$1[,=]/!d;s/.*=//;q"; } <infile
ただし、$1
入力を検証することもできます。
またはGNUを使用grep
して、次のようにしますcut
。
getval() { grep -Em1 "^([^=]*,)*$1[,=]" | cut -d= -f2-; } <infile