在Xcode运行脚本bin/sh中使用sed查找并替换多行

在Xcode运行脚本bin/sh中使用sed查找并替换多行,xcode,sed,replace,multiline,carriage-return,Xcode,Sed,Replace,Multiline,Carriage Return,我有一个cocos2dtmx文件,它非常类似于xml,包含回车和空格 我的要求是: 在参考资料/地图中的每个tmx文件中/ 找到和之间的一切 <tileset firstgid="1" #/usr/bin/env bash sed-rni'/极客使用python对TMX映射文件执行此类操作。只是一个考虑的选项。 类似这样(但迭代目录中的所有文件等),并将其另存为.sh文件: #!/usr/bin/env python import re #you'd open a file and

我有一个cocos2dtmx文件,它非常类似于xml,包含回车和空格

我的要求是:

在参考资料/地图中的每个tmx文件中/

找到和之间的一切

<tileset firstgid="1"
#/usr/bin/env bash

sed-rni'/极客使用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!"
请注意,运行脚本设置“在生成日志中显示环境变量”中的设置对于获取环境变量(如
SOURCE\u ROOT
等)以定位文件非常有帮助

祝你好运

$cat文件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
abc def ghi $cat文件2 之前 东西
这里有一种方法可以使用
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
}


/将此类文件的示例上传到某个地方,如果不是那么大,甚至可以使用pastebin.com。好的,这里还编辑了我的帖子以包含pastebin。@解释您使用的是什么版本的sed(可以通过
sed获得--version
)?我的是GNU sed 4.2.1。如果你和cygwin一起运行sed,它可能太旧了
-r
选项代表扩展正则表达式语法。上面的代码可能适用于老式的regexp,但这需要更多的模式转义-但我建议使用支持更干净的regexp语法的sed。我一直很难找到版本。我使用的是OSXLion附带的一个,它在Xcode中的运行脚本命令行中使用。我尝试了你的编辑,但是得到了“意外的EOF(挂起的})”这是我要确认的代码:我给你看了四个选项:a)用分号将前几行分隔成一行来编写代码-也许这会有帮助;b) 试图进一步修复上面的代码,使其符合POSIX(或Apple)标准,但我保证这将是一个充满乐趣和惊人语法形式的漫长过程;c) 转到苹果技术支持;d) install GNU sed我安装了GNU sed,并将命令全部设置为一行,我得到sed:1:“/替换的
p
和读取文件的
r
之间可能缺少分号。我可以在Xcode中作为运行脚本运行此脚本吗?我希望它在每次构建时都能自动发生。在文件的第一行放一个shebang行,并将文件命名为.sh,也许chmod它是可执行的,你应该很好<代码>#/usr/bin/env python
作为第一行。我将myScript.py放在与项目文件相同的目录中,执行chmod命令,并将$(SOURCE_ROOT)/myScript.py放在运行脚本控制台中,得到错误行2:/myScript.py:没有这样的文件或目录。请注意,我在控制台中调用了我的myScript.py(大写S),并将其作为实际文件名。看起来可能是您键入了SOURCE_ROOT,或者未设置它。检查拼写。如果看起来正确,那么打开我上面提到的
在构建日志中显示环境变量
设置,检查SOURCE\u ROOT的值,确保它指向.py文件所在的位置。文件名大小写必须匹配,否则无关紧要。路径或文件名中的空格也可能是一个问题,但错误并没有表明这一点(如果路径中有空格,请酌情使用引号)。我发现错误是因为没有在SOURCE_ROOT周围使用括号而不是括号。此外,此解决方案似乎适用于我的项目根目录中的文件,而不是我的资源。我没有尝试GNU sed,但BSD/OSX one会替换后面的所有内容,包括…而不是.txt文件的内容。谢谢,但脚本没有任何效果。我保证script.sed的位置是正确的(在参考资料/maps\u sideScrolling/中)。我发现@vague解释中的.*与您的sed的man(或者更好的信息)页面不一致,因为我怀疑它是否真的支持文件读取。在构建时,它会给我大量的Shell脚本调用错误“command not found”和“在tileset”和“layer”之类的东西上没有这样的文件或目录”“@vague解释-看,这个脚本很琐碎,很简单。如果对您来说失败了,那么您调用它的方式或您的数据或其他您尚未与我们共享的内容有问题,因此,对脚本所在的文件进行cat,复制/粘贴该脚本的输出,以及您运行命令的终端显示和您收到的特定错误消息,并使用该信息更新您发布的问题,以便我们可以进一步帮助您。第一个pastebin显示示例输入、命令及其正确运行。第二个pastebin显示了一组错误消息,这些消息似乎是执行名为“Script-84A160B416B83E2100C7987A.sh”的文件的结果,您没有向我们显示该文件的内容,但有点像您试图执行awk命令的输出。您可以看到awk命令在您的第一个pastebin中工作,对吗?我们需要知道“.sh”文件包含什么,它会在第二个pastebin中生成错误消息,以便为您提供更多帮助—这是失败的地方,而不是awk脚本。
#!/usr/bin/env python

print 'hello from python!'
$ 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
sed -f script.sed Resources/maps_sideScrolling/*.tmx
/<tileset firstgid="1"/ {

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

    r Resources/maps_sideScrolling/tileProperties.txt

    p

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