2016-07-30 80 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特定的解决方案。 –

相关问题