때로는 정규식이 올바른지 테스트하고 싶습니다.
regex
stdin에서 역방향 일치를 어떻게 수행할 수 있나요 ?
Fe 다음과 같이 제공된 정규식과 문자열을 일치시킬 수 있습니다.
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
한 줄에 하나의 정규식이 포함된 일반 텍스트 파일은 어디에 있습니까?