将一组YAML文件中的某些字段合并到另一组

时间:2016-09-05 10:21:30

标签: bash macos yaml

我在一个文件夹中有一组YAML配置文件,另一个文件夹中有一组几乎相同的文件。我试图迁移一个网站,我需要复制" uuid"从源文件到dest文件的字段。 " uuid"每个文件都不同。我无法找到执行此操作的脚本,所以尝试了这个:

SRC=$ROOT/in
DEST=$ROOT/out

cd $SRC
for f in *
do
  echo "Processing $f file..."
  # Find the original UUID
  repl = "$(cat $f |grep uuid)"
  echo "Found UUID: $repl"
  # Replace line into same file
  sed -i "s/^uuid:.*$/$repl/" $DEST/$f
done

永远不会填充$ repl变量,但我知道95%的文件都有该行且运行cat FILENAME |grep uuid匹配。

有更好的方法吗?和/或我做错了什么?

更新:谢谢@sjsam我已经更新了。但是,输出仍然如下:

Processing views.view.who_s_online.yml file...
./merge-uuids.sh: line 11: repl: command not found
Found UUID: 
sed: 1: "/Users/nic/git/cn-d8/co ...": extra characters at the end of n command

更新2:@Anthon在我的情况下,uuid: ...行始终是第一行(并且它始终是第一顺序键),但并非所有文件实际上都有此行。在任何情况下,sed正则表达式都不应该与文件中的uuid:前缀匹配吗?

更新3:谢谢@Anton,在修复repl周围的空格后,我实际上正在读取值,但sed仍然不满意。现在输出:

Processing views.view.who_s_online.yml file...
Found UUID: uuid: 07cc0b9d-feda-42cf-9584-cc3f640cbb41
sed: 1: "/Users/nic/git/cn-d8/co ...": extra characters at the end of n command

是否需要使用正则表达式匹配的标志?

更新4:看起来我遇到了一些FreeBSD / OSX问题(见sed extra characters at end of l command)。我尝试将sed行更改为:

  sed -i .orig "s!^uuid:.*$!${repl}!;" "${DEST}/${f}"

现在错误就像:

Processing blah.yml file...
Found UUID: uuid: 5940516b-c188-4d78-8e85-cff8f746ba67
sed: 1: "s!^uuid:.*uuid: 5940516 ...": unterminated substitute in regular expression

更新5:我将行更改为echo "Found UUID: '${repl}'",输出类似于Found UUID: 'uuid: eff29d5a-a9fe-4430-a7e9-2a6ecb944ce0' - 即字符只是冒号,字母数字和空格。

1 个答案:

答案 0 :(得分:1)

这个问题存在多个问题:

class ConstraintComparator extends SebastianBergmann\Comparator
{
    public function accepts($expected, $actual)
    {
        return $expected instanceof \PHPUnit_Framework_Constraint;
    }
    public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
    {
        $expected->evaluate($actual);
    }