grep|sed|awk를 사용하여 stdin에서 정규식 테스트

grep|sed|awk를 사용하여 stdin에서 정규식 테스트

때로는 정규식이 올바른지 테스트하고 싶습니다.

regexstdin에서 역방향 일치를 어떻게 수행할 수 있나요 ?

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한 줄에 하나의 정규식이 포함된 일반 텍스트 파일은 어디에 있습니까?

관련 정보