여러 줄의 텍스트를 통해 텍스트 검색

여러 줄의 텍스트를 통해 텍스트 검색

aplay -L여러 장치와 해당 설명을 나열하는 데 사용하고 있습니다 .

$ aplay -L
null
    Discard all samples (playback) or generate zero samples (capture)
pulse
    PulseAudio Sound Server
surround40:CARD=PCH,DEV=0
    HDA Intel PCH, ALC1220 Analog
    4.0 Surround output to Front and Rear speakers
hw:CARD=PCH,DEV=0
    HDA Intel PCH, ALC1220 Analog
    Direct hardware device without any conversions

여기서 null, hw:CARD=PCH,DEV=0surround40:CARD=PCH,DEV=0장치 이름입니다. 장치 이름과 설명으로 패턴을 검색하고 설명과 일치하는 장치 이름을 찾고 싶습니다.
내 기대는

aplay -L | pattern_match_command "Surround output"

surround40:CARD=PCH,DEV=0 마찬가지로 돌아올 것이다

aplay -L | pattern_match_command "pulse"

반환됩니다 pulse.
기본적으로 각 장치의 컨텍스트는 다음과 같습니다.

surround40:CARD=PCH,DEV=0
    HDA Intel PCH, ALC1220 Analog
    4.0 Surround output to Front and Rear speakers

현재 설명이 포함되지 않은 행 처리를 사용하고 있습니다.

aplay -L | grep "pulse"

어떤 도구를 사용할 수 있는지에 대한 힌트가 있습니다. 나는 사용하고있다ubuntu 18.04

답변1

사용 awk:

aplay -L |
pat='surround' awk '
    BEGIN { pat = tolower(ENVIRON["pat"]) }
    /^[^[:blank:]]/ { dev = $0; next }
    tolower($0) ~ pat { print dev }'

awk명령은 공백이 아닌 문자로 시작하는 변수의 모든 줄을 기억합니다 dev. 다른 행이 주어진 패턴과 일치할 때마다 dev변수 값이 출력됩니다.

모드는 환경 변수를 통해 전달됩니다 pat. 소문자로 변환되어 awk변수 에 저장됩니다 pat. 패턴이 행과 일치하면 해당 행도 소문자로 변환되므로 이러한 의미에서 패턴 일치는 대소문자를 구분하지 않습니다.

샘플 데이터를 기반으로 위 명령의 출력은 다음과 같습니다.

surround40:CARD=PCH,DEV=0

surround이 줄의 단어 와 일치하므로

4.0 Surround output to Front and Rear speakers

답변2

PCRE 지원과 함께 GNU grep 사용

mygrep() {
## helper  variables to make writing of regex tractable:-

## any nonwhitespace char which is not a colon
noncolon='(?:(?!:)\S)'
nonequal='(?:(?!=)\S)'

# these occur in the description line after the colon, akin to key=value pairs
pair="${nonequal}+=${nonequal}+"

# a header line comprises a run of noncolon nonwhitespace optionally followed by pairs
hdr="${noncolon}+(?::(?:,?${pair})+)?"

# description line is one that begins with a space and has atleast one nonwhitespace
descline='(?:\s.*\S.*\n)'

# supply your string to search for in the description section here ( case insensitive)
srch=$1
t=$(mktemp)

aplay -L | tee "$t" \
| grep -Pzo \
 "(?im)^${hdr}\n(?=${descline}*\h.*\Q${srch}\E)" \
| tr -d '\0' \
| grep . ||
grep -iF -- "$1" "$t"
}

## now invoke mygrep with the search string
mygrep  'card=pch'

산출:-

surround40:CARD=PCH,DEV=0
hw:CARD=PCH,DEV=0

관련 정보