나는 개선하려고 노력하고 있습니다.따옴표를 추출하는 bash 스크립트iBooks(Apple의 책 읽기 소프트웨어)에서 콘텐츠를 복사할 때 생성되는 문자열입니다.
파일의 첫 번째 줄을 추출하여 이 작업을 수행할 수 있다는 것을 알고 있지만 head -1 filename
파일을 보는 것이 아니라 여러 줄 바꿈이 있는 문자열을 보는 것입니다.
클립보드 예시는 다음과 같습니다.
“When there is no data to guide intuition, scientists impose a “compatibility” criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.”
Excerpt From
The Island of Knowledge
Marcelo Gleiser
This material may be protected by copyright.
이전에 유효한 bash 스크립트(이 섹션에 설명된 대로)스택 교환 답변) 예:
sed -E -e 's/^[ ]?[0-9]* //g' | sed -E -e 's/“[ ]?[0-9]?[ ]?//g' | sed -E -e 's/”$//g' | sed -E -e 's/^(Excerpt From).*//g'
이제 마지막 세 줄만 남았습니다.
답변1
sed
파이프라인에서 여러 번 실행할 필요가 없습니다 . sed
여러 -e
옵션을 선택할 수 있으며 각 옵션에는 선언이 있습니다. 하나의 옵션만 사용 -e
하고 명령문을 세미콜론으로 구분할 수도 있습니다 ;
. 또는 각각 여러 개의 분리된 문이 있는 여러 -e
옵션도 ;
있습니다.
sed 명령은 다음과 같이 작성하는 것이 가장 좋습니다.
sed -E -e 's/^[ ]?[0-9]* //g; s/^“[ ]?[0-9]?[ ]?//g; s/”$//g; s/^(Excerpt From).*//g'
두 번째 명령문에서는 세 번째 명령문 이 ^
줄 끝에 고정을 사용하는 방식과 유사하게 정규식 패턴을 줄의 시작 부분에 "고정"했습니다 $
.
그러나 sed는 여러 줄 문자열을 잘 처리하지 못합니다.
그러나 Perl은 -p
옵션을 사용하여 sed를 대체할 수 있습니다(적어도 sed
이와 같은 간단한 스크립트의 경우 - 더 복잡한 sed 스크립트는 완전히 perl 스크립트로 다시 작성하는 것이 가장 좋습니다).
$ cat /tmp/book.txt
“When there is no data to guide intuition, scientists impose a “compatibility” criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.”
Excerpt From
The Island of Knowledge
Marcelo Gleiser
This material may be protected by copyright.
$ perl -0777 -p -e 's/^[ ]?[0-9]* //msg;
s/^“[ ]?[0-9]?[ ]?//msg;
s/”$//msg;
s/^(Excerpt From).*//msg;
s/^\s*$//msg' /tmp/book.txt
When there is no data to guide intuition, scientists impose a “compatibility” criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.
세미콜론 뒤의 공백(sed 예에서)과 개행 문자(perl 예에서)는 선택 사항입니다. 이는 단지 가독성을 위한 것이며 sed 및 Perl 스크립트 실행 방법에는 영향을 미치지 않습니다.
s/^\s*$//msg
빈 줄을 제거하는 또 다른 명령문이 추가됩니다 .나머지 "스마트" 따옴표를 일반 큰따옴표 문자로 변환하려면
s/“|”/"/g;
이 문s/^\s*$//msg
앞에 다른 문을 추가하세요. 그러면 출력은 다음과 같습니다.When there is no data to guide intuition, scientists impose a "compatibility" criterion: any new theory attempting to extrapolate beyond tested ground should, in the proper limit, reproduce current knowledge.
이러한
s///
문은 아마도 최적화될 수 있지만 테스트할 샘플이 더 이상 없기 때문에 다른 입력에 대해 작동하지 않는 경우를 대비해 시도하기가 꺼려집니다.-0777
Perl에게 전체 파일을 하나의 긴 문자열로 한 번에 읽도록 지시합니다.-p
Perl에게 입력을 반복하고-e
스크립트의 명령문을 실행한 다음 스크립트가 수정한 후 입력을 인쇄하도록 지시합니다. 즉,sed
작동 방식과 매우 유사합니다.와 마찬가지로
sed
이-e
옵션은 다음 인수가 스크립트임을 나타냅니다.m
정규 표현식 수정자는s
Perl 정규 표현식이 여러 줄 문자열을 처리하는 방식을 변경합니다. 에서man perlre
:
"m"
일치하는 문자열을 여러 줄로 처리합니다. 즉, 문자열의 첫 번째 줄의 시작과 마지막 줄의 끝을 일치시키는 것에서 문자열의 모든 줄의 시작과 끝을 일치시키는^
것으로 변경합니다.$
"s"
문자열을 한 줄로 처리합니다. 즉,.
일반적으로 일치하지 않는 모든 문자, 개행 문자까지 일치하도록 변경합니다.함께 사용하면 문자열의 개행 문자 뒤와 앞의 문자를 각각 허용하고 일치시키면서 모든 문자 일치를
/ms
허용합니다 ..
^
$