때로는 정규식이 올바른지 테스트하고 싶을 때가 있습니다.
regex
표준 입력에서 역방향 일치를 수행하는 방법은 무엇입니까 ?
Fe I는 문자열을 제공된 정규 표현식과 일치시킬 수 있습니다. 예를 들면 다음과 같습니다.
grep "\(foo\)-bar"
foo
bar
foo-bar
foo-bar #Match found
내가 하고 싶은 일은 그 반대입니다. 다음과 같습니다.
$ grep "This is one string"
\(This\) #Will send "This" to stdout
This?.* #Will send full match
너무 많은 스크립팅 없이 이것이 가능합니까?
답변1
셸에서 다음 함수를 정의합니다(직접 입력하거나 셸에 넣을 수 있음 ~/.bashrc
).
testregex() {
[ "$#" -eq 1 ] || return 1
while IFS= read -r line; do
printf '%s\n' "$1" | grep -Eoe "$line"
done
}
그런 다음 다음과 같이 정규식을 테스트할 수 있습니다.
$ testregex 'This is a line'
This <--input
This <--output
This?.* <--input
This is a line <--output
slkdjflksdj <--input with no output (no match)
s.* <--input
s is a line <--output
$ <--I pressed Ctrl-D to end the test
답변2
-
일치하는 "핀"을 검색하기 위해 표준 입력을 "건초 더미"로 사용하는 "파일"을 사용하여 검색 할 수 있습니다 .
$ grep -oE '[aeiou]+' -
This is a test < input
i > output
i > output
a > output
e > output
whaaaat? < input
aaaa > output
Ctrl-를 사용하여 스트림을 D보내고 종료합니다.EOF
-f
그러나 파일에서 패턴 목록을 읽는 스위치와 함께 표준 입력을 사용하여 동일한 작업을 수행 할 수 있다고 생각하지 않습니다 . 그러나 말뭉치에 텍스트 패턴이 많으면 다음을 수행할 수 있습니다.
grep -f needle-patterns haystack.txt
그중에는 needle-patterns
한 줄에 하나의 정규 표현식이 포함된 일반 텍스트 파일이 있습니다.