첫 번째 세미콜론 뒤의 모든 세미콜론을 바꾸는 방법은 무엇입니까?

첫 번째 세미콜론 뒤의 모든 세미콜론을 바꾸는 방법은 무엇입니까?

이 문제는 Excel 파일의 질문과 답변을 Anki 플래시카드 프로그램이 설명된 대로 처리하는 .txt 파일로 가져오려는 시도와 관련이 있습니다.여기. 필드를 2개 이상 가질 수 없으므로 옵션을 하나의 필드로 설정해야 합니다.

Anki 매뉴얼에 설명된 대로 LibreOffice에서 CSV 형식으로 저장된 데이터(필드 구분 기호로 사용되는 세미콜론 - 매뉴얼의 내용과만 다름)

Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
...

모든 옵션이 포함된 각 항목은 "플래시카드"라는 행에 있습니다. 카드에서 전반부는 세미콜론 앞에 오고 후반부는 세미콜론 뒤에 옵니다. 줄바꿈 등의 두 번째 플래시카드.

원하는 출력은 UTF-8이어야 합니다.

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n
...

내 Perl 의사코드는 다음을 기반으로 합니다.답변

perl -00 -pe s/;/\0/; s/;/ |/g; s/\0/;/' file

댓글을 달았습니다.

perl -00 -pe '   # each record is separated by blank lines (-00)
                 # read the file a record at a time and auto-print (-p)
    s/;/\0/;    # turn the first semicolon into a null byte
    s/;/ |/g;     # replace all other semicolons with " |"
    s/\0/;/     # restore the first semicolon
' file

첫 번째 세미콜론 뒤의 모든 세미콜론을 바꾸는 방법은 무엇입니까?

답변1

GNU 사용 sed:

sed 's/;/|/2g'

;|두 번째 발생 부터 전역적으로 교체합니다.

sed 's/;/|/2sum 은 POSIX 이지만 s/;/|/g구성은 POSIX가 아니며 동작은 구현마다 다릅니다. 그러나 GNU 구현을 사용하면 sed이 동작이 명확하게 문서화됩니다.

답변2

sed 'y/|;/\n|/;s/|/;/;y/\n/|/' <<\IN
Question ipsun; option 1 ; option 2 ; option 3 ; option 4 ; ... ; option n
IN

이렇게 되니 참고하세요아니요대부분의 교체를 처리하려면 정규식을 사용하되, 대신에 보다 기본적인(그리고 더 뛰어난 성능) 번역하다이를 수행하는 함수 - POSIX 이식 가능한 방식으로 수행합니다. 이는 sedPOSIX가 설치된 모든 시스템에서 작동합니다 .

세미콜론을 파이프 ;로 , 파이프를 줄줄이로 동시에 변환합니다. 이 파이프는 입력 라인에 어떤 일이 발생하는 경우를 대비해 라인 으로 남습니다 . 그런 다음 파이프 의 첫 번째 발생을 세미콜론 으로 바꾼 다음 모든 줄을 파이프로 변환하여 단일 대체를 강력하게 처리하기 위해 남은 모든 것을 복원합니다 .||\n|\ns///|;\n|s///

복사/붙여넣기 데모를 위해 여기 문서를 사용하는 동안 <<\IN아마도 <infile >outfile.

산출:

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n

답변3

간단히 sed -e 's/;/|/g' -e 's/|/;/' data.csv다음을 수행할 수 있습니다.

Question ipsun; option 1 | option 2 | option 3 | option 4 | ... | option n

이것은 당신이 원하는 것 같습니다.

답변4

당신은 작은 실수를 저질렀습니다:

~$ perl -00 -pe 's/;/\0/; s/;/\n/g; s/\0/;/' file
Question; option 1
 option 2
 option 3
 option 4
 ...
 option n

당신은 무엇을 했나요:

s/;//g;     # remove all other semicolons
s/\0/;/     # restore the first semicolon

당신이 원한다고 말한 것 :

s/;/\n/g;     # change all other semicolons
s/\0/;/     # restore the first semicolon

관련 정보