이 문제는 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/;/|/2
sum 은 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 이식 가능한 방식으로 수행합니다. 이는 sed
POSIX가 설치된 모든 시스템에서 작동합니다 .
세미콜론을 파이프 ;
로 , 파이프를 줄줄이로 동시에 변환합니다. 이 파이프는 입력 라인에 어떤 일이 발생하는 경우를 대비해 라인 으로 남습니다 . 그런 다음 파이프 의 첫 번째 발생을 세미콜론 으로 바꾼 다음 모든 줄을 파이프로 변환하여 단일 대체를 강력하게 처리하기 위해 남은 모든 것을 복원합니다 .|
|
\n
|
\n
s///
|
;
\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