텍스트(어셈블리 코드)가 있다고 가정합니다.
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를 사용하여 달성할 수 있지만 이는 복잡할 것입니다. 귀하의 작업에는 일부 언어로 된 완전한 스크립트 또는 프로그램이 필요합니다.
다양한 명령의 특성을 따르는 것이 도움이 될 수 있습니다.
- Grep 컨텍스트: grep이 제공하는 유일한 컨텍스트는 줄 수
before
와after
일치하는 줄 [-A
,-B
,-C
(처음 두 개 조합)] 입니다. - Awk 및 Sed: 이를 사용하면 2가지 패턴 내에서 텍스트를 검색할 수 있습니다.
하지만 이것도 복잡해질 수 있습니다. 내가 이해한 바에 따르면, 당신은 일종의 파서를 작성하려고 하므로 복잡한 명령을 작성하기 전에 작성 도구를 조사하고 시험해 보아야 합니다.