R 替换 YAML 中的引用值
R replace quoted values in YAML
我正在替换 Yaml 文件中的值,需要选择要引用的值。
我不理解 write.yaml
当前的行为
library(yaml)
test <- list("a"=list("b"="123", "c"="rabbitmq"))
as.yaml(test)
write_yaml(test, "test.yaml")
在 test.yaml
中,"123"
被引用而 rabbitmq
不是。我怎样才能刻意选择要引用的内容?
解决方法
虽然对于更复杂的 YAML 文件输出来说这可能很困难,但是对于 yaml 包明显无法强制引用的问题,有一种解决方法,如下所述。在这个例子中,我们可以使用正则表达式来匹配任何 non-quoted 连续的字母或数字组,并在其周围强制引号。
library(stringr)
test <- list("a"=list("b"=123L, "c"="rabbitmq", d = "Yes"))
test_yaml <- as.yaml(test)
test_yaml
#> [1] "a:\n b: 123\n c: rabbitmq\n d: 'Yes'\n"
我们可以在这里看到我们可能想要引用 123
和 rabbitmq
(Yes
已经在引号中)。
test_yaml <- str_replace_all(test_yaml, "(?<=:\s)([a-zA-Z0-9]*?)(?=\n)", "'\1'")
test_yaml
#> [1] "a:\n b: '123'\n c: 'rabbitmq'\n d: 'Yes'\n"
然后将其写入您的 YAML 文件。
write_yaml(test_yaml, "/Users/caldwellst/Desktop/test.yaml")
然后我们得到你想要的输出。
a:
b: '123'
c: 'rabbitmq'
d: 'Yes'
yaml 包
write_yaml
使用字符串强制引号,否则 123
将被解释为数字。 rabbitmq
不需要引号,因为它会自动被解释为字符串。如果你真的希望 123
被解释为数字,就这样传递它。
test <- list("a"=list("b"=123, "c"="rabbitmq"))
as.yaml(test)
write_yaml(test, "test.yaml")
然后你得到:
a:
b: 123.0 # pass b as 123L to force integer output
c: rabbitmq
根据 write_yaml
的文档:
Character vectors that have a class of ‘verbatim’ will not be quoted in the output YAML document except when the YAML specification requires it
虽然这是一种强制输出不带引号的特定值的方法,但似乎没有简单的方法来强制对值进行引号。我试过在字符串中传递 unicode = T
和显式引号,但它们被删除了。同样,我试图通过传入各种处理程序来操纵 class(并删除 verbatim
(如果它在那里)来欺骗系统。但是,none 似乎有效。因为源代码是在 C 中,无法使用 write_yaml
函数。
此 great SO post 中有关于 YAML 语法和一般引用的详细答案。
我正在替换 Yaml 文件中的值,需要选择要引用的值。
我不理解 write.yaml
library(yaml)
test <- list("a"=list("b"="123", "c"="rabbitmq"))
as.yaml(test)
write_yaml(test, "test.yaml")
在 test.yaml
中,"123"
被引用而 rabbitmq
不是。我怎样才能刻意选择要引用的内容?
解决方法
虽然对于更复杂的 YAML 文件输出来说这可能很困难,但是对于 yaml 包明显无法强制引用的问题,有一种解决方法,如下所述。在这个例子中,我们可以使用正则表达式来匹配任何 non-quoted 连续的字母或数字组,并在其周围强制引号。
library(stringr)
test <- list("a"=list("b"=123L, "c"="rabbitmq", d = "Yes"))
test_yaml <- as.yaml(test)
test_yaml
#> [1] "a:\n b: 123\n c: rabbitmq\n d: 'Yes'\n"
我们可以在这里看到我们可能想要引用 123
和 rabbitmq
(Yes
已经在引号中)。
test_yaml <- str_replace_all(test_yaml, "(?<=:\s)([a-zA-Z0-9]*?)(?=\n)", "'\1'")
test_yaml
#> [1] "a:\n b: '123'\n c: 'rabbitmq'\n d: 'Yes'\n"
然后将其写入您的 YAML 文件。
write_yaml(test_yaml, "/Users/caldwellst/Desktop/test.yaml")
然后我们得到你想要的输出。
a:
b: '123'
c: 'rabbitmq'
d: 'Yes'
yaml 包
write_yaml
使用字符串强制引号,否则 123
将被解释为数字。 rabbitmq
不需要引号,因为它会自动被解释为字符串。如果你真的希望 123
被解释为数字,就这样传递它。
test <- list("a"=list("b"=123, "c"="rabbitmq"))
as.yaml(test)
write_yaml(test, "test.yaml")
然后你得到:
a:
b: 123.0 # pass b as 123L to force integer output
c: rabbitmq
根据 write_yaml
的文档:
Character vectors that have a class of ‘verbatim’ will not be quoted in the output YAML document except when the YAML specification requires it
虽然这是一种强制输出不带引号的特定值的方法,但似乎没有简单的方法来强制对值进行引号。我试过在字符串中传递 unicode = T
和显式引号,但它们被删除了。同样,我试图通过传入各种处理程序来操纵 class(并删除 verbatim
(如果它在那里)来欺骗系统。但是,none 似乎有效。因为源代码是在 C 中,无法使用 write_yaml
函数。
此 great SO post 中有关于 YAML 语法和一般引用的详细答案。