내 입력 파일 줄 형식은 다음과 같습니다.
themostsimpleproject', branch 'debug_randomnness' : AFFECTED. Affected image discovered: [7.19, 8.37]
awk를 사용하여 영향을 받은 이미지의 프로젝트 이름과 버전을 인쇄하고 싶습니다. 예:
themostsimpleproject 7.19, 8.37
awk에서 어떻게 할 수 있나요? 나는 명령줄을 통해 실행할 수 있는 간단한 코드를 선호합니다. 전임자: awk -F"\," 'print $1 $4'
. 그러나 간단한 스크립트도 환영합니다.
'
참고: 프로젝트 이름 끝에 인쇄하고 싶지 않습니다 .
답변1
다음을 사용해 보세요 awk
.
awk -F "[]'[]" '/: AFFECTED/{print $1, $(NF-1)}' input
-F
필드 구분 기호(FS)를 정의합니다. 이것은정규식 문자열, 포함캐릭터 클래스"문자 클래스에 포함된 모든 문자"를 의미하는 ([..]
)는 필드 구분 기호입니다.- 여기에서 선택한 문자는
'
,[
또는 입니다]
. ]
닫는 문자로 처리되지 않도록 하려면 먼저 와야 합니다 . (당신도 탈출할 수 있어요!)
- 여기에서 선택한 문자는
첫 번째 필드는
$1
first 로 끝나므로'
프로젝트 이름은 다음과 같습니다.$1
영향을 받는 버전은 입니다
$(NF-1)
.]
마지막 문자와 마찬가지로$NF
비어 있습니다.
산출:
themostsimpleproject 7.19, 8.37
이는 문자열이 있는 줄을 검색 : AFFECTED
한 다음 2개 이상이 영향을 받더라도 모든 이미지 버전을 출력합니다.
답변2
awk -F "'" '{gsub(/:.*:/,"",$NF);gsub(/[\]\[]/,"",$NF);print $1,$NF}' filename
산출
themostsimpleproject 7.19 8.37
답변3
다음을 사용할 수도 있습니다 sed
.
$ sed "s/^\(.*\)',.*\[\(.*\)\]$/\1 \2/" file
themostsimpleproject 7.19, 8.37
아니면 GNU 버전을 사용하세요
$ sed -E "s/^(.*)',.*\[(.*)\]$/\1 \2/" file
themostsimpleproject 7.19, 8.37
답변4
또한 다음과 같이 제공됩니다 awk
:
awk '{gsub(/[][]/,"");gsub(/[[:punct:]]/,"",$1);print $1, $(NF-1),$NF}' file
themostsimpleproject 7.19, 8.37
[
field1 에서 모든 구두점을 제거했습니다]
.gsub()
- 그런 다음 첫 번째 필드와 마지막 두 필드를 인쇄합니다.