3

xml によく似た Cocos2D tmx ファイルがあり、キャリッジ リターンとスペースが含まれています。

私の要件は次のとおりです。

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 スニペットのペーストビンは次のとおりです: http://pastebin.com/wr39zj1r

4

4 に答える 4

1

オタクは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!"

コードは、タイルが存在する場合に備えて、タイルセットfirstgid="1"の前にコンテンツを処理します。

Xcode 4でこのようなスクリプトを使用するには、次のようにします。

  • スクリプトをプロジェクトファイルの隣のファイルに入れ、名前を付けますmyscript.py
  • chmod +x myscript.pyスクリプトファイルを実行可能にするために使用します。
  • Xcodeプロジェクトで、プロジェクトとターゲットを選択し、[ビルドフェーズ]タブを選択してから、新しい[スクリプトの実行]ビルドフェーズを作成します。
  • / bin/shのデフォルトシェルのままにします
  • スクリプトフィールドに次のように入力します。 $(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 に答える
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 は、-nprint ( p) が強制されるか、ファイルの読み取りが行われるまで何も出力しません。

コメント付きでスクリプトを実行しようとすると突然エラーが発生したため、投稿を削除しましたが、コマンドで読み取るファイル名とコメントの間のスペースrがファイル名への継続として扱われることがわかったので、コメントを削除して説明しますsed のスクリプト コマンドを 1 行ずつ:

  1. まずパターンを探します。
  2. 2 行目では、見つかった行の有用な部分が出力されます。
  3. 次に、ファイルから読み取ります。
  4. 次の行にはラベルが含まれています。これは、行ごとに読み取って検索するためです。
  5. 見つかって出力された終了パターンに一致する行。
  6. 一致する最初の終了パターンのみが必要なため、置換が成功した場合はスクリプトの最後に移動します。
  7. 置換が実行されなかった場合、最後へのジャンプはなくloop、新しい行がパターン スペースにロードされようとするラベルにジャンプします。
于 2013-02-06T01:35:03.160 に答える
0

を使用する 1 つの方法を次に示し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 に答える