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