我在一个文件夹中有一组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'
- 即字符只是冒号,字母数字和空格。
答案 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);
}