줄의 어느 곳에서나 grep AND 함수

줄의 어느 곳에서나 grep AND 함수

grepAND 함수를 구현하는 방법이 있나요 ? 내 말은 이것이다:

다음 줄이 있습니다.

I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new

grep그래서 "new line"뿐만 아니라 "new"와 "line"이라는 단어가 모두 포함된 줄을 찾고 싶습니다 . 나는 이것을 할 수 있다는 것을 안다:

grep new file | grep line

그러나 그것은 내가 찾고 있는 것이 아닙니다. 하나의 명령으로 이 작업을 수행 하고 싶습니다 grep. 이는 스크립트가 사용자에게 두 용어를 모두 입력하도록 요청하고 용어 중 하나가 비어 있을 수 있으므로 오류가 발생하고 grep스크립트가 중단되기 때문입니다.

답변1

비어 있거나 설정되지 않은 경우 두 번째 항목을 실행하지 마세요 grep.

grep -e "$term1" <file |
if [ -n "$term2" ]; then
    grep -e "$term2"
else
    cat
fi

이는 grep호출된 파일의 패턴을 적용한 다음 비어 있지 않은지 여부에 따라 결과에 두 번째 패턴을 적용하거나 통과 필터 역할을 합니다.$term1file$term2grepcat

이는 비어 있을 때 " "로 변질되는 것을 제외하고 " term1AND term2"를 효과적으로 구현합니다 .term2term1


전혀 실행하고 싶지 않지만 grep두 번째 항목이 비어 있으면 빈 결과를 반환하는 경우:

if [ -n "$term2" ]; then
    grep -e "$term1" <file | grep -e "$term2"
fi

term1이는 " AND " 를 효과적으로 구현 하고 null을 "false" term2로 처리합니다 .term2

이것의 장점은 표준에만 의존 grep하고 두 모드가 독립적으로 유지되므로 이해하고 유지 관리하기가 쉽다는 것입니다.

답변2

이것은 작동합니다 (GNU 사용 grep):

grep -P '(?<=new)\s(?=line)' file

시험:

$ cat > file
I have this one line
I don't have this other line
I have this new line now
I don't have this other new line
This line is new
^D

$ grep -P '(?<=new)\s(?=line)' file
I have this new line now
I don't have this other new line

답변3

man grep"연결"과 "대체"를 결합 해 보세요 :

P1=line
P2=new
grep "$P1.*$P2\|$P2.*$P1" file
I have this new line now
I don't have this other new line
This line is new

관련 정보