2016-07-30 2 views
1

이전 게임 콘솔 용 컴파일러를 사용하고 있지만이 컴파일러는 ANSI 문자 만 허용합니다. UTF-8이 필요한 게임이 일본어로되어 있기 때문에 문제가됩니다. 이 문제를 해결하기 위해 문서의 모든 일본어 문자를 16 진수로 대체 한 sed를 실행하는 일괄 처리 스크립트를 작성했습니다.sed : 각 문자를 구분 기호 사이에서 개별적으로 바꿉니다.

주요 나오지 스크립트는 다음과 같습니다

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

그래서 같은 문자열 "ャ ィ ャ [터미네이터]"로 변환됩니다 "$ 00 $ 01 $ 00, $ FF".

숫자 및 문장 부호와 같이 텍스트 문자열에 삽입 할 수있는 비 일본어 문자도 코드의 다른 곳에서도 사용되므로 문제를 방지하려면 이러한 문자의 대체 버전을 사용해야합니다. 모든 주석 앞에 세미콜론을 변환하면 컴파일 프로세스가 실패하게됩니다. 그러나이 해결 방법을 사용하면 사용자는 일반적 으로처럼 입력하는 대신 수정하는 느낌을주는 문자열에이 대체 문자를 복사하여 붙여 넣어야합니다.

그래서, 내 질문은 어떻게 문자열 구분 기호 (파이프) 사이의 문자를 대체 할 수 있습니다 문서에서 사방에 대체를 수행하는 대신? 즉

, 내가 원하는 다음과 같습니다 뭔가 대체 할 나오지이에

<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 

나는 작은 따옴표가 가장 의미가있는 곳이다. CMD는 큰 따옴표를 선호하므로 사안을 복잡하게합니다. 최악의 경우 스크립트를 파일에 넣고 전화하십시오. awk -F "|" -f scriptfile.awk test.asm >test2.asm

플랫폼에 Awk가 없으면 Perl, Python 또는 Ruby에서도 비슷해야합니다. (펄도 펄 된 awk 스크립트를 변환하기위한 a2p와 함께 제공됩니다.)

+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) 

C1, C2 "와 같은 계산 LABEL 이름은 귀찮게하는 것처럼 보일 경우 또한 독특한 라벨 서비스를 제공 할 수가타카나 :

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

메모.그것은 g 것 같다lobal의 옵션 earch 일한해야합니다

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

는가 이 도움이되지 않습니다, 그것은 단지 대체 lobal 와일드 카드g 추가 하나 "-"가있는 "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 : 제안 해 주셔서 감사합니다. 실행이 빨라 보였으므로 3 인승을 수락했으나, 원래 sed 특정 솔루션을 요청했기 때문에 당신을 받아들이려고 유혹을 받았습니다. –

관련 문제