Ruby 使用sed在Rakefile中编写xml标记

Ruby 使用sed在Rakefile中编写xml标记,ruby,xml,macos,sed,rakefile,Ruby,Xml,Macos,Sed,Rakefile,我试图使用Rakefile预处理一个类似xml的文件,我试图做的是添加一组xml标记 下面的sed是我所做工作的简短版本 sed -ig '/TARGET_STRING/{N;G;s/$/<key>KEY_NAME<\/key>/g;}' whateverfile.xml 执行rake后,会提示错误并终止任务 sed: 1: "/TARGET_STRING/{N;G;s/$/ ...": bad flag in substitute command: 'k' 我搜索了

我试图使用
Rakefile
预处理一个类似xml的文件,我试图做的是添加一组xml标记

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

sed -ig '/TARGET_STRING/{N;G;s/$/<key>KEY_NAME<\/key>/g;}' whateverfile.xml
执行
rake
后,会提示错误并终止任务

sed: 1: "/TARGET_STRING/{N;G;s/$/ ...": bad flag in substitute command: 'k'
我搜索了很长时间,在
Ruby
中找不到任何关于转义
字符的信息


我的平台

  • 操作系统:Mac OS X 10.9
  • Ruby:2.0.0p247
  • 耙:0.9.6
  • sed:7

更新

嗨,谢谢你们的快速回复

还有“铁皮人”, 对于

我要做的是预处理Xcode项目文件(.pbxproj),它是xml格式的

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

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

除了最琐碎和受控的解析之外,对任何事情使用正则表达式都会导致疯狂。使用,一个优秀的RubyXML/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
需要“nokogiri”

xml=解析器是更好的解决方案

要了解sed的观点,请尝试

`sed -ig '/TARGET_STRING/{
    N
    s/$/\
<key>KEY_NAME<\/key>/
    }' whateverfile.xml`
`sed-ig'/TARGET\u字符串/{
N
/$/\
关键字名称/
}'whateverfile.xml`
G通常不需要,因为没有加载任何内容
g也是不需要的,只有一种替换方法

如果要处理XML,为什么要尝试使用正则表达式?取而代之的是使用解析器,例如,这是Ruby最常用的解析器。向我们展示一个合理的XML示例,以及您期望的结果,我们可以帮助您以正确的方式完成。感谢您的快速回复,我会看一看,然后试一试。感谢您提供的解决方案,使用他人的轮子非常好:)谢谢您的建议:)。是否有
N
之后丢失?它显示了
sed:1:“/TARGET_STRING/{N s/$/…”:N命令末尾的额外字符
错误界面键盘/椅子,忘记将答案的脚本部分设置为“code”模式。您在一行上是正确的,但在本例中没有丢失;因为这是一个“\N”(已更正的传入代码模式显示)。抱歉
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>
`sed -ig '/TARGET_STRING/{
    N
    s/$/\
<key>KEY_NAME<\/key>/
    }' whateverfile.xml`