【问题标题】:Using sed to write xml tag in Rakefile使用 sed 在 Rakefile 中写入 xml 标签
【发布时间】:2023-04-08 04:22:02
【问题描述】:

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

以下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中的&lt;&gt;字符的信息。


我的平台

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

更新

您好,感谢大家的快速回复。

还有@the Tin Man, 对于comment

我要做的是预处理 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>

【问题讨论】:

  • 如果您正在处理 XML,为什么要尝试使用正则表达式?而是使用解析器,例如 Nokogiri,这是 Ruby 最常用的解析器。向我们展示一个合理的 XML 样本,以及您期望的结果,我们可以帮助您以正确的方式完成。

标签: ruby xml macos sed rakefile


【解决方案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>

注意&lt;foo&gt; 标签内的内容发生了变化,同时&lt;bar&gt; 获得了一个属性。

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

【讨论】:

  • 感谢您的快速回复,我去看看,拍个照。
  • 谢谢你的解决方案,用别人的轮子真好:)
【解决方案2】:

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

对于 sed 的观点尝试

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

通常不需要G,因为没有加载任何内容 g 也不需要,只能替换 1 个

【讨论】:

  • 感谢您的建议 :)。在N 之后是否错过了;?它显示sed: 1: "/TARGET_STRING/{ N s/$/ ...": extra characters at the end of N command
  • 错误界面键盘/椅子,忘记在“代码”模式下设置答案的脚本部分。您在 OneLine 上是对的,但在这种情况下没有丢失;因为这是一个“\n”(更正了代码模式显示中的传递)。对不起
猜你喜欢
  • 2017-12-12
  • 2018-12-17
  • 2021-12-11
  • 2015-10-07
  • 1970-01-01
  • 2015-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
相关资源
最近更新 更多