2016-07-30 77 views
1

我使用的舊遊戲機編譯器,但這種編譯器只接受ANSI字符。這是一個問題,因爲遊戲是日文,需要UTF-8。作爲一種變通方法,我寫的執行已與sed的十六進制同等字節值來代替文檔中的每個日文字符批處理腳本。sed的:分隔符之間單獨更換每個字符

主要sed腳本是這樣的:

chcp 1252 
sed "s|\[terminator\]|,$FF|g"^ 
;"s|ャ|,$00|g"^ 
;"s|ィ|,$01|g"^
test.asm > test2.asm 

因此,像一個字符串 「ャィャ[終結者]」 將被轉換爲 「$ 00 $ 01 $ 00 $ FF」。

問題是可以插入到文本字符串中的非日語字符(例如數字和標點符號)也在代碼中的其他任何地方使用,所以我不得不求助於這些字符的替代版本以防止在每次評論之前都會轉換分號,這會使編譯過程失敗。但是,這種解決方法促使用戶複製和粘貼,而不是隻是打字他們就像他們通常會每一種備選字符到哪個字符串,他們覺得自己修改。

所以,我的問題是,我怎麼能告訴sed只替換字符串分隔符(管道),而不是在文檔中到處進行替代的角色?

換句話說,我希望SED更換的東西,看起來像這樣:

<label> dw $1234 : db |ャィャ[terminator]|  ; Comment (blah ャィャ blah) 

這(管道和領先的逗號將會在後面被刪除):

<label> dw $1234 : db |,$00,$01,$00,$FF|  ; Comment (blah ャィャ blah) 

通知的註釋部分保持不動。

+0

您應該編輯您的問題。沒有人似乎理解它,或者有人已經有答案。這部分令人困惑:「但我想用更方便用戶的方式將字符串保留在原始文檔中」 –

+0

完成「。現在它更有意義嗎? –

+0

當然。你甚至得到了一個迴應,它可能會成爲一個風滾草問題 –

回答

2

有可能是一種方式,sed做到這一點;但維護起來會很複雜和具有挑戰性。我的建議是換個不同的語言,這很容易。這裏是Awk:

awk -F '|' '{ gsub(/\[terminator]/, "$FF", $2); 
    gsub(/ャ/, ",$00", $2); 
    gsub(/ィ/, ",$01", $2); } 1' test.asm >test2.asm 

我在Unix上,單引號在這裏最有意義。我瞭解CMD傾向於使用雙引號,這會使事情變得複雜;在最壞的情況下,也許把這個腳本在文件中,並與awk -F "|" -f scriptfile.awk test.asm >test2.asm

調用它。如果你沒有在awk您的平臺,這應該是在Perl,Python和Ruby的或類似的容易。 (Perl的甚至帶有a2p對翻譯的awk腳本給Perl)

+0

謝謝,通過用雙引號替換單引號,並通過轉義雙引號,在最後刪除冒號後,我設法使其工作。 –

+0

修復冒號錯字;感謝通知,並感謝接受! – tripleee

+0

我注意到你只能逃脫開放方括號,但不是最後一個。這是另一個錯字,還是它沒有區別? –

2
echo \ 
    '<address> dw $1234 : db |ャィャ[terminator]|  ; Comment (blah ャィャ blah)' | \ 
sed 's/\[terminator\]/,$FF/; 
    :c1 s/ャ\(.*\)|/,$00\1|/;t c1; 
    :c2 s/ィ\(.*\)|/,$01\1|/;t c2' 

輸出:

<address> dw $1234 : db |,$00,$01,$00,$FF|  ; Comment (blah ャィャ blah) 

如果像「C1C2計算標籤的名稱,似乎是很麻煩的事情,那些片假名也可以作爲了唯一標籤:

sed 's/\[terminator\]/,$FF/; 
    :ャ s/ャ\(.*\)|/,$00\1|/;t ャ; 
    :ィ s/ィ\(.*\)|/,$01\1|/;t ィ' 

注意事項。這似乎是葉形的選項小號目錄操作搜索應該有工作:

echo abcdabcdabcd | sed 's/a/-/g' 
-bcd-bcd-bcd 

添加通配符葉形沒有幫助,它只是取代one帶「 - 」的「a」:

echo abcdabcdabcd | sed 's/a\(.*\)/-\1/g' 
-bcdabcdabcd 

循環工作:

echo abcdabcdabcd | sed ':c1 s/a\(.*\)/-\1/;t c1' 
-bcd-bcd-bcd 
+0

@triplee,如果您發現了錯誤,請更具體。目前你的評論似乎有點令人費解,因爲這個例子的輸出證實了1)給定的答案避免了評論,2)應付了重複的片假名。 – agc

+0

我的不好,當我測試它時,我似乎搞砸了一些東西。刪除了我的評論。對於那個很抱歉。 – tripleee

+0

agc:感謝您的建議。我最終接受了tripleee,因爲它在執行中看起來更快,但很想接受你的,因爲我原本是要求一個sed特定的解決方案。 –

相關問題