grep + regex: 데이터를 상황에 맞는 요소와 일치시키기 위한 패턴을 작성하는 방법은 무엇입니까?

grep + regex: 데이터를 상황에 맞는 요소와 일치시키기 위한 패턴을 작성하는 방법은 무엇입니까?

텍스트(어셈블리 코드)가 있다고 가정합니다.

st.w    av,d15
ld.w    d15,av

우리가 그것을 grep하고 싶다고 가정 해 봅시다. 다음 패턴을 사용할 수 있습니다.

pattern=\
'\s+st.w\s+av,.*'\
'\s+ld.w\s+.*,av'

.*참고: 레지스터 이름을 일치시키는 데 사용됩니다 . 이러한 레지스터 이름은 향후 변경될 수 있습니다.

레지스터 이름에 특별한 정규 표현식을 사용한다고 가정해 보겠습니다. 특별한 키워드를 추가합니다 @reg:

pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@reg,av'

그런 다음 모든 특수 키워드를 실제 정규식 패턴으로 바꾸는 prepend 함수를 grep 패턴에 추가합니다.

preprocess_pattern () {
    local result=$1
    # Replace @reg to exact regex pattern [a..d][0..15].
    result=${result//'@reg'/'[a-d](1[0-5]|[0-9])'}
    # Add other replacements (if need).
    #result=${result//''/''}
    echo "$result"
}

그런 다음 preprocess_pattern()실행하기 전에 호출합니다 grep.

pattern="$(preprocess_pattern $pattern)"
if ! grep -Pzo $pattern code.asm > /dev/null
then
    echo "grep #$i failed (pattern: "$pattern")"
    ((++failed))
fi

작동하지만 우리는 더 많은 것을 원합니다.

@preg우리는 즉, 추가하고 싶습니다 .이전 등록.

pattern=\
'\s+st.w\s+av,@reg'\
'\s+ld.w\s+@preg,av'

이제 문제는 각 발생 후 로직을 추가할 위치와 방법입니다.@reg 구하다d15특수 스택/버퍼의 값과 각 발생 이후의 값 일치(우리의 경우)@preg 찾다@preg스택/버퍼의 값을 일치시키고 ? 값과 비교하여 값을 확인합니다.

즉, 데이터와 일치하는 패턴을 작성하는 방법상황에 맞는요소? 그렙은 괜찮나요?

가능하다면(즉, 가능하다면) 이를 설명하는 방법상황 민감도패턴으로?

그렇지 않다면(즉 불가능하다면) 이 문제를 해결하기 위해 또 무엇을 할 수 있습니까?

답변1

달성하려는 것은 아마도 grep + regex를 사용하여 달성할 수 있지만 이는 복잡할 것입니다. 귀하의 작업에는 일부 언어로 된 완전한 스크립트 또는 프로그램이 필요합니다.

다양한 명령의 특성을 따르는 것이 도움이 될 수 있습니다.

  1. Grep 컨텍스트: grep이 제공하는 유일한 컨텍스트는 줄 수 beforeafter일치하는 줄 [ -A, -B, -C(처음 두 개 조합)] 입니다.
  2. Awk 및 Sed: 이를 사용하면 2가지 패턴 내에서 텍스트를 검색할 수 있습니다.

하지만 이것도 복잡해질 수 있습니다. 내가 이해한 바에 따르면, 당신은 일종의 파서를 작성하려고 하므로 복잡한 명령을 작성하기 전에 작성 도구를 조사하고 시험해 보아야 합니다.

관련 정보