需要一个脚本来从单个文本文件中的单词生成文件

yel*_*ood 2 shell-script text-processing

我有以下场景,我缺乏 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]
Run Code Online (Sandbox Code Playgroud)

我想用他所属的地区为每个名字生成文件。

例如noah.txt将包含coolregion, niceregionjacob.txtcoolregion只包含。

我非常了解正则表达式,所以如果你能指出我正确的方向(即只需要正则表达式来完成的脚本),我也会很高兴。

如果重要的话,我的 linux 版本是“Debian GNU/Linux 5.0”。

Gil*_*il' 5

这是一个 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
}'
Run Code Online (Sandbox Code Playgroud)

不要太当真,但这里有一个 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
)
Run Code Online (Sandbox Code Playgroud)