긴 텍스트 파일의 고유한 줄에 있는 문자열을 인쇄해야 합니다. 파일의 관련 줄 예 long.txt
:
Software version 4.0.10, 2002-03-28
원하는 문자열은 정확히 입니다 4.0.10
.
단계는 대략 다음과 같습니다.
- 예를 들어 다음과 같은 정규 표현식을 사용하여 라인을 일치시킵니다.
/^Software/
- 해당 줄을 찾으면 해당 줄에서 원하는 문자열(다른 정규식)을 검색하세요.
- 문자열 인쇄
sed
, 또는 와 같은 도구를 사용하여 awk
한 줄(파이프를 사용하지 마십시오)로 이 작업을 수행하려면 어떻게 해야 합니까 perl
?
참고: 실제 정규식은 그다지 관련이 없습니다. 가장 중요한 것은 관련된 명령과 구문입니다. 감사해요!
답변1
sed
귀하의 질문은 매우 일반적입니다. 잠시 시간을 내어 해당 디자인 과 이와 같은 사용 사례를 처리하는 방법에 대해 논의하고 싶습니다 .
sed
스트림 편집기입니다. 스트림(파이프, 단일 파일 또는 일련의 파일)에서 텍스트 입력을 받아들이고 해당 텍스트 스트림에 대한 작업을 수행하고 텍스트를 출력합니다. (참고로 이건아니요원래 개념은 문서 편집을 위해 의도되었거나 설계되었지만 종종 이러한 목적으로 사용됩니다. )
sed
알아야 할 핵심 사항은 다음과 같습니다.
sed
텍스트를 한 줄씩 처리합니다. 귀하가 제공한 명령은 기본적으로 각 입력 줄에서 작동하고(기본적으로) 끝에 결과를 인쇄하는 루프입니다(기본적으로).- 명령은
sed
선택적인 조건부 테스트(또는 "패턴")와 수행할 작업으로 구성됩니다. p
모든 작업은 rint,s
ubstitute,d
elete 와 같은 단일 문자 명령입니다.- 가장 일반적인 조건은 줄과 일치하는 정규식이지만 줄 번호를 사용할 수도 있습니다.
- ㅏ범위지정할 수 있습니다. 즉, 모든 행에 대해 다음 작업을 수행합니다.~에서(첫 번째 조건)에 따라(두 번째 조건).
가지다매우 자세한 튜토리얼 및 참고자료sed
온라인에서 무료로 볼 수 있으므로 전체 내용을 읽어 보시기 바랍니다.
귀하의 시나리오에서 원하는 명령은 다음과 같습니다.
sed -n -e '/^Software/{s/,.*//;s/.*[[:space:]]//;p;}' filename
번역하면 다음과 같습니다.
-n
:sed
각 입력 줄을 인쇄하는 기본 동작을 억제합니다.-e
:다음sed
명령 을 실행하십시오./^Software/
{}
: 이 정규식과 일치하는 행에만 포함된 다음 명령 세트를 실행합니다.s/,.*//
:줄의 첫 번째 쉼표(및 그 뒤의 모든 항목)를 제거합니다.s/.*[[:space:]]//
:마지막 공백 문자까지 줄의 모든 항목을 제거합니다.p
: 결과 텍스트를 인쇄합니다.
답변2
선택할 수 있는 몇 가지 옵션은 다음과 같습니다.
sed -n 's/Software version \([^,]\+\).*/\1/p' file
awk -F '[ ,]' '$1=="Software" && $2=="version" {print $3}' file
perl -nE '/Software version (.+?),/ and say $1' file
grep -oP '(?<=Software version ).+?(?=,)' file
모두 버전 문자열에 쉼표가 없다고 가정합니다.
답변3
다음 테스트 버전을 사용해 보세요.
awk '{if ($0 ~ /^Software/) {print substr($3,1,length($3)-1)}}' long.txt
각 줄의 세 번째 요소를 다음과 같이 인쇄합니다.소프트웨어.
하위 문자열마지막 문자 '를 제거하는 데 사용됩니다.,' 세 번째 요소부터 시작하세요.
시험을 치르다:
awk '{if ($0 ~ /^Software/) {print substr($3,1,length($3)-1)}}' long.txt
4.0.10