전체 행과 일치하는 부분 행을 수집하는 방법은 무엇입니까?

전체 행과 일치하는 부분 행을 수집하는 방법은 무엇입니까?

full line라인의 와 을 동시에 출력할 수 있습니까 ?matched parts

이 입력이 있다고 가정 해 보겠습니다.

low [ 0]: 0xffff0000 Interesting description A
hi  [ 0]: 0xffff00a0 Interesting description B
low [ 1]:     0x5000 Interesting description C
hi  [ 1]:     0x6000 Interesting description D
...
hi  [15]:   0x806000 ...

흥미로운 부분으로 16진수 값을 추출한 다음 전체 라인을 추출하고 싶습니다. Paste와 2개의 grep 명령을 사용해 보았지만 매우 부피가 큰 느낌이 들고 프로세스 교체를 피하고 싶습니다( <()). 이것이 내가 얻는 것입니다:

paste -d'\n' <(grep    '0x[0-9a-zA-Z]*' "$file") \
             <(grep -o '0x[0-9a-zA-Z]*' "$file")

이 작업을 수행하는 더 중요한 방법은 무엇입니까? awk를 고려 중이지만 일치하는 부분을 쉽게 가져와 인쇄할 수 있는지 확실하지 않습니다( ???아래).

/0x[0-9a-zA-Z]*/ { print $0 ; print ??? }

출력 예:

low [ 0]: 0xffff0000 Interesting description A
0xffff0000 
hi  [ 0]: 0xffff00a0 Interesting description B
0xffff00a0 
low [ 1]:     0x5000 Interesting description C
0x5000 
hi  [ 1]:     0x6000 Interesting description D
0x6000 
...
hi  [15]:   0x806000 ...
0x806000 

답변1

아마도 다음 방법을 사용하여 이 작업을 수행할 것입니다 sed.

sed -e '/.*\(0x[[:xdigit:]]*\).*/!d' -e p -e 's//\1/' file

먼저 형식에 16진수가 포함되지 않은 모든 줄을 삭제합니다 0xnnnn.... 라인이 삭제되지 않으면 수정되지 않은 라인을 인쇄하고 이를 다시 출력하기 전에 간단히 16진수로 대체합니다.

마지막 단계에서는 첫 번째 편집 표현식에 사용된 정규식을 재사용합니다. 즉, \1일치하는 모든 항목(전체 행)을 대괄호 안의 하위 표현식(16진수)에 의해 캡처된 하위 문자열로 바꿀 수 있습니다.

답변2

어떤 이상한 경우 :

awk 'match($0,/0x[0-9a-zA-Z]*/) {print $0; print substr($0,RSTART,RLENGTH)}' file

GNU awk 사용:

gawk 'match($0,/0x[0-9a-zA-Z]*/,arr) {print $0; print arr[0]}' file

0x[0-9a-zA-Z]*교체를 고려해 볼 수도 있습니다.0x[[:xdigit:]]+

답변3

awk를 사용하십시오.

$ awk '{r=$0; sub(/[^:]+/,""); print r ORS $2}' file
low [ 0]: 0xffff0000 Interesting description A
0xffff0000
hi  [ 0]: 0xffff00a0 Interesting description B
0xffff00a0
low [ 1]:     0x5000 Interesting description C
0x5000
hi  [ 1]:     0x6000 Interesting description D
0x6000
hi  [15]:   0x806000 ...
0x806000

귀하의 질문에 있는 해당 줄이 실제로 귀하의 입력 내용에 존재하지 않는다고 생각 ...하므로 제거하겠습니다.

관련 정보