単一のテキストファイルの単語でファイルを生成するスクリプトが必要です。

単一のテキストファイルの単語でファイルを生成するスクリプトが必要です。

以下のシナリオがありますが、Linuxの知識が不足してもあまり役に立ちません。

次の内容のYML値を含むテキストファイルがあります。

coolregion:
  min: {z: -99613.0, y: 45.0, x: -99805.0}
  flags: {vehicle-place: allow}
  max: {z: 100387.0, y: 127.0, x: 100195.0}
  priority: 0
  type: cuboid
  owners:
    groups: [jacob, eithan, michael]
  members:
    groups: [jack, noah]
niceregion:
      min: {z: 544.0, y: 6.0, x: 184.0}
  flags: {}
  max: {z: 556.0, y: 13.0, x: 197.0}
  priority: 0
  type: cuboid
  owners:
    groups: [noah]
  members:
    groups: [logan, lucas, jack]

それぞれの名前とそれが属する領域のファイルを生成したいと思います。

たとえば、銀がnoah.txt含まれます。coolregion, niceregionjacob.txtcoolregion

私は正規表現をかなりよく知っているので、正しい方向(例:正規表現だけでトリックを実行するスクリプト)を教えてくれてうれしいです。

重要な場合、私のLinuxバージョンは「Debian GNU / Linux 5.0」です。

ベストアンサー1

これはawkソリューションです。私はYMLがわからないので、正規表現を操作する必要があるかもしれません(例えば、領域マーカーをインデントできますか?)。このprint data >filename構成は、指定されたファイル名に最初に到達したときにファイルを作成または切り取り、それをファイルに追加します。

<input.yml awk '
/^[^ :]+: *$/ {sub(/: *$/,""); region=$0}     # start of region
/^ *groups:/ {                                # owner or member list
    sub(/^[^:]*: *\[/, ""); sub(/\].*/, "");  # extract bracketed names
    split($0, names, / *, */);                # split comma-separated list
    for (n in names)                          # iterate over names
        print region >names[n] ".txt";        # write or append to name file
}'

あまり真剣に受け入れられませんが、ここにsedとShellソリューションがあります。

<input.yml sed -n -e '/^[^ ]/ h' \
                  -e '/^ \+groups:/ {' \
                    -e 'G' \
                    -e 's/^[^:]*: *\[\(.*\)\]\n\(.*\):/\2,\1/' \
                    -e 's/, \+/,/g' \
                    -e 'p' -e '}' | (
  IFS=,; set -f
  while read -r region names; do
    for name in $names; do
      echo "$region" >>"$name.txt"
    done
  done
)

おすすめ記事