줄 바꿈을 사용하여 문자열의 첫 번째 줄 가져오기

줄 바꿈을 사용하여 문자열의 첫 번째 줄 가져오기

나는 개선하려고 노력하고 있습니다.따옴표를 추출하는 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///문은 아마도 최적화될 수 있지만 테스트할 샘플이 더 이상 없기 때문에 다른 입력에 대해 작동하지 않는 경우를 대비해 시도하기가 꺼려집니다.

  • -0777Perl에게 전체 파일을 하나의 긴 문자열로 한 번에 읽도록 ​​지시합니다.

  • -pPerl에게 입력을 반복하고 -e스크립트의 명령문을 실행한 다음 스크립트가 수정한 후 입력을 인쇄하도록 지시합니다. 즉, sed작동 방식과 매우 유사합니다.

  • 와 마찬가지로 sed-e옵션은 다음 인수가 스크립트임을 나타냅니다.

  • m정규 표현식 수정자는 sPerl 정규 표현식이 여러 줄 문자열을 처리하는 방식을 변경합니다. 에서 man perlre:

"m" 일치하는 문자열을 여러 줄로 처리합니다. 즉, 문자열의 첫 번째 줄의 시작과 마지막 줄의 끝을 일치시키는 것에서 문자열의 모든 줄의 시작과 끝을 일치시키는 ^것으로 변경합니다.$

"s" 문자열을 한 줄로 처리합니다. 즉, .일반적으로 일치하지 않는 모든 문자, 개행 문자까지 일치하도록 변경합니다.

함께 사용하면 문자열의 개행 문자 뒤와 앞의 문자를 각각 허용하고 일치시키면서 모든 문자 일치를 /ms허용합니다 ..^$

관련 정보