3

我有一个 Cocos2D tmx 文件,它非常像 xml,包括回车和空格。

我的要求是:

在 Resources/maps_sideScrolling/ 中的每个 tmx 文件中

找到和之间的一切

<tileset firstgid="1"

和第一次发生

<layer name="background"

并替换为 Resources/maps_sideScrolling/tileProperties.txt 的内容

我试过以下没有结果。该问题是由于要搜索的字符串有多行引起的。

sed -i '' 's{<tileset firstgid="1.*<layer name="background"{Resources/maps_sideScrolling/tileProperties.txt{g' Resources/maps_sideScrolling/*.tmx;

这是我要编辑的 tmx 片段的 pastebin:http: //pastebin.com/wr39zj1r

4

4 回答 4

1
#!/usr/bin/env bash

sed -rni '/<tileset\s+firstgid="1"/ {
s/(\s*<tileset\s+firstgid="1").*/\1/p
r /home/username/ololofile
:loop
n
s/.*<layer name="background".*/&/p
t
b loop
}' ~/files/to/replace/*

带选项的 sed-n将不输出任何内容,直到 print ( p) 被强制或有一些文件读取。

当我尝试运行带有评论的脚本时突然出现错误,因此删除了我的帖子,但后来发现要使用命令读取的文件名和评论之间的空格r被视为文件名的延续,所以我删除了评论并将描述现在逐行执行 sed 的脚本命令:

  1. 寻找一个模式开始;
  2. 在第二行打印出找到的行的有用部分;
  3. 然后从文件中读取;
  4. 下一行包含标签,因为现在我们逐行读取和搜索;
  5. 与找到并打印的结束模式匹配的行;
  6. 因为我们只需要第一个匹配的结束模式,如果替换成功,则转到脚本的末尾;
  7. 如果没有执行替换,则没有跳转到末尾并跳转到loop标签,新行将尝试加载到模式空间中。
于 2013-02-06T01:35:03.160 回答
1

Geek 使用 python 对 TMX 地图文件做这种事情。只是一个可以考虑的选项。

像这样(但迭代目录等中的所有文件),并将其保存为 .sh 文件:

#!/usr/bin/env python

import re

#you'd open a file and read in the tile properties thing
fakeTileProperties = "<tileproperties>1</tileproperties>\r"

f = open( "file1.tmx", "rU")
fo = open( "outputfile.tmx", "wc");

#read source file
s = f.read();

#find what you need
m = re.search("([\W\w]*)(<tileset firstgid=\"1\"[\W\w]*)(<layer name=\"background\"[\W\w]*)", s )

#write out to source file
fo.write(m.group(1))
fo.write(fakeTileProperties)
fo.write(m.group(3));

f.close();
fo.close();

print "done!"

代码在 tile set firstgid="1" 之前处理内容,以防万一。

要在 Xcode 4 中使用这样的脚本,请执行以下操作:

  • 将您的脚本放在项目文件旁边的文件中,为其命名myscript.py
  • 用于chmod +x myscript.py使脚本文件可执行。
  • 在您的 Xcode 项目中选择项目和目标以及“构建阶段”选项卡,然后创建一个新的“运行脚本”构建阶段。
  • 保留 /bin/sh 的默认 shell
  • 将以下内容放入脚本字段: $(SOURCE_ROOT)/myscript.py

然后,当您进行构建时,您应该会看到 python 脚本被执行。你可以做一个非常简单的测试python文件来测试它(我刚刚做过):

#!/usr/bin/env python

print 'hello from python!'

请注意,运行脚本设置“在构建日志中显示环境变量”中的设置对于获取诸如此类的环境变量SOURCE_ROOT以定位您的文件非常有帮助。

祝你好运!

于 2013-02-07T13:59:18.313 回答
1
$ cat file1
abc
def
ghi

$ cat file2
pre
stuff
<tileset firstgid="1"
foo
bar
<layer name="background"
post
stuff

$ awk '
   NR==FNR { s=s ORS $0; next }
   /<tileset firstgid="1"/    { print $0 s; f=1 }
   /<layer name="background"/ { f=0 }
   !f
' file1 file2
pre
stuff
<tileset firstgid="1"
abc
def
ghi
<layer name="background"
post
stuff

请注意,上面根据您想要的分隔符将 file2 中的 foo\nbar 替换为 file1 的内容。如果您也想删除分隔线,这是一个微不足道的调整。

于 2013-02-09T22:32:03.323 回答
0

这是使用sed. 像这样运行:

sed -f script.sed Resources/maps_sideScrolling/*.tmx

内容script.sed

/<tileset firstgid="1"/ {

    s/\(<tileset firstgid="1"\).*/\1/

    r Resources/maps_sideScrolling/tileProperties.txt

    p

    :a
    N
    s/.*\(<layer name="background".*\)/\1/
    t
    ba
}

请让我知道情况如何。我目前无法使用机器,BSD sed因此无法正确测试它。但是,我的直觉是它应该对你有用。

于 2013-02-10T14:38:02.237 回答