2017-10-27 16 views
1

일부 값이 포함 된 file.txt가 있습니다. 특정 줄에서 대괄호 사이에서 정보를 추출하는 방법을 모르겠습니다.음성 줄에있는 두 개의 괄호 사이에있는 모든 정보를 별도의 파일로 제거하려고합니다.

선은 오스카 내가 추출하는 데 필요한 정보는 괄호

Sonia = 0 
Oscar = [191, 229, 115, 105, 0, 78, 154, 122, 210, 0] 
EnableDebugConsole = true 
Ralph = 99 
Run = 0 

내가 생각하고 내가 미래에 알 수 있도록 괄호없이 값을 저장 할 수 있다면 그것은 웅대 한 것 사이에있다. 이 웹 사이트에서 몇 가지 예를 모아서 시도해 보았습니다. 그것은, 난 여전히 내 목표 중 하나를 달성 할 수있는 가장 좋은 방법은 아마 내가 내가 내가 file_no_brackets.txt을 가질 수 브래킷을 제거 어떻게 지금은 정보

에게있다해도, 그대

grep Oscar file.txt > file_remove.txt 
cut -d \= -f 2 file_remove.txt | tr -d " \t\n\r" > file_brackets.txt 
cat file_brackets.txt 

[191,229,115,105,0,78,154,122,210,0] 

즉, 예를 들어 sed으로 아주 간단하게 할 수 있도록

191,229,115,105,0,78,154,122,210,0 

답변

2

같이 괄호 사이에 그냥 값을 보유 패턴 공간의

$ sed -n '/^Oscar/s/^[^[]*[[]\([^]]*\).*$/\1/p' file 
191, 229, 115, 105, 0, 78, 154, 122, 210, 0 

설명

  1. sed -n 억제 인쇄

  2. /^Oscar/Oscar

  3. 's/match/replace/ 표준 sed 스와로 시작하는 줄을 찾습니다 당신이 정규식 match 일치 대체 내부 replace

  4. 로 교체 bstitution 당신이 /^[^[]* 일치하는 모든 문자가 아닌 '['

  5. [[]을 일치 '['

  6. \([^]]*\) 캡처 모든 문자가 아닌 ']'이 (나머지 문자는 .*$과 일치 함)

  7. replace\1이고 이면 참조 번호은 캡처 그룹의 텍스트를 위의 6으로 바꿉니다.

  8. /p/^Oscar/의 대체 결과와 일치하는 결과를 인쇄하십시오.

완료.

+0

많은 감사드립니다. –

1

awk 구조!

$ awk -F'\\[|\\]' '/Oscar/{print $2}' file 

은 오른쪽 또는 왼쪽 대괄호에 필드 구분 기호를 설정합니다. 선을 찾고 첫 번째와 두 번째 필드 구분 기호 (즉, 필드 2) 사이의 텍스트를 인쇄하십시오.

1

awk (s)도 다음과 같이 도움이 될 수 있습니다.

솔루션 1 : 간단한 검색 문자열 Oscar를 사용하여 제공하는 정규식을 사용하여 일을 대체 전역에 gsub 유틸리티를 사용하여.

awk '/Oscar/{gsub(/.*\[|\]/,"");gsub(/, /,",");print}' Input_file 

해결 방법 2 : 문자열 Oscar의 간단한 검색을 사용하여 다음과 같이 awkmatch 기능을 사용하여.

awk '/Oscar/{gsub(/, /,",");match($0,/\[.*\]/);if(substr($0,RSTART+1,RLENGTH-2)){print substr($0,RSTART+1,RLENGTH-2)}}' Input_file 

해결책 3 :][ 같이 필드 분리 작성하고 필요한 적절한 필드 인쇄.

awk -F"[][]" '/Oscar/{gsub(/, /,",",$2);print $2}' Input_file 
1

사용 gawk

$ awk 'match($0,/^Oscar.*\[([^]]*)]/,arr){print arr[1]}' infile 

테스트 결과 :

$ cat infile 
Sonia = 0 
Oscar = [191, 229, 115, 105, 0, 78, 154, 122, 210, 0] 
EnableDebugConsole = true 
Ralph = 99 
Run = 0 

$ awk 'match($0,/^Oscar.*\[([^]]*)]/,arr){print arr[1]}' infile 
191, 229, 115, 105, 0, 78, 154, 122, 210, 0 

만 그렙와

$ awk '/^Oscar/ && gsub(/^.*\[|\]/,"")' infile 
191, 229, 115, 105, 0, 78, 154, 122, 210, 0 
0

당신이

를 원하는 경우 어떤 AWK
grep "Oscar = \[" file.txt | grep -o [0-9][^]]* >file_no_brackets.txt