提问人:vc7 提问时间:12/4/2013 最后编辑:Communityvc7 更新时间:12/4/2013 访问量:138
使用 sed 在 Rakefile 中写入 xml 标签
Using sed to write xml tag in Rakefile
问:
我尝试使用 预处理类似 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>
答:
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
感谢您:)的建议。之后有没有错过?它显示;
N
sed: 1: "/TARGET_STRING/{ N s/$/ ...": extra characters at the end of N command
0赞
NeronLeVelu
12/4/2013
错误界面键盘/椅子,忘记在“代码”模式下设置答案的脚本部分。您在 OneLine 上是对的,但在这种情况下,没有遗漏;因为这是一个“\n”(更正了代码模式的传递显示)。不好意思
评论