使用 sed 在 Rakefile 中写入 xml 标签

Using sed to write xml tag in Rakefile

提问人:vc7 提问时间:12/4/2013 最后编辑:Communityvc7 更新时间:12/4/2013 访问量:138

问:

我尝试使用 预处理类似 xml 的文件,我尝试做的是添加一组 xml 标签。Rakefile

以下是我所做工作的简短版本sed

sed -ig '/TARGET_STRING/{N;G;s/$/<key>KEY_NAME<\/key>/g;}' whateverfile.xml

这段代码在使用终端时工作得很好,很成功。

我把它们放进我做的,像这样:Rakefile

desc 'setup pods archs'
task :setup_podsarchs => :setup_submodules do
    puts 'Altering xml...'.cyan
    `sed -ig '/TARGET_STRING/{N;G;s/$/<key>KEY_NAME<\/key>/g;}' whateverfile.xml`
end

执行后,提示错误并终止任务rake

sed: 1: "/TARGET_STRING/{N;G;s/$/ ...": bad flag in substitute command: 'k'

我四处搜索了很长时间,找不到任何关于转义和字符的信息。<>Ruby


我的平台

  • 操作系统: Mac OS X 10.9
  • 红宝石版本:2.0.0p247
  • 耙: 0.9.6
  • 赛德: 7

更新

嗨,谢谢你们极快的回复。

和@the铁皮人, 对于评论

我试图做的是预处理 Xcode 项目文件 (.pbxproj),其结构为 xml,

为简单起见,我只在这里展示 xml 结构的示例:

<dict>
    <key>Key_ONE</key>
    <string>1</string>
</dict>

我试图做的是找到并在那之后添加另一个键:KEY_ONE

<dict>
    <key>Key_ONE</key>
    <string>1</string>
    <key>Key_TWO</key>
    <string>2</string>
</dict>
Ruby XML macOS SED Rakefile

评论

0赞 the Tin Man 12/4/2013
如果您正在处理 XML,为什么要尝试使用正则表达式?相反,请使用解析器,例如 Nokogiri,这是 Ruby 最常用的解析器。向我们展示您的 XML 的合理示例,以及您期望的结果是什么样子,我们可以帮助您以正确的方式完成它。

答:

1赞 the Tin Man 12/4/2013 #1

将正则表达式用于最琐碎和可控的解析之外的任何内容都会导致疯狂。使用 Nokogiri,一个优秀的 Ruby XML/HTML 解析器。例如:

require 'nokogiri'

xml = <<EOT
<xml>
  <foo>foo</foo>
  <bar>bar</bar>
</xml>
EOT

doc = Nokogiri::XML(xml)

doc.at('foo').content = 'bar'
doc.at('bar')['class'] = 'cyan'

puts doc.to_xml

输出:

<?xml version="1.0"?>
<xml>
  <foo>bar</foo>
  <bar class="cyan">bar</bar>
</xml>

请注意,标签内的内容发生了变化,同时获得了属性。<foo><bar>

使用解析器的重要一点是,内容可以更改,标签参数可以更改,它们的顺序可以在标签内移动,标签可以拆分为多行,解析器不会关心,而正则表达式会喷出火焰并停止工作。

评论

0赞 vc7 12/4/2013
谢谢你的快速回复,我会看看,然后拍一拍。
0赞 vc7 12/6/2013
谢谢你的解决方案,使用别人的轮子:)真是太好了
0赞 NeronLeVelu 12/4/2013 #2

解析器是更好的解决方案。

对于 SED 的观点,请尝试使用

`sed -ig '/TARGET_STRING/{
    N
    s/$/\
<key>KEY_NAME<\/key>/
    }' whateverfile.xml`

G 通常不需要,因为没有加载到 也不需要 g,可以更换 onle 1

评论

0赞 vc7 12/4/2013
感谢您:)的建议。之后有没有错过?它显示;Nsed: 1: "/TARGET_STRING/{ N s/$/ ...": extra characters at the end of N command
0赞 NeronLeVelu 12/4/2013
错误界面键盘/椅子,忘记在“代码”模式下设置答案的脚本部分。您在 OneLine 上是对的,但在这种情况下,没有遗漏;因为这是一个“\n”(更正了代码模式的传递显示)。不好意思