grep
AND 함수를 구현하는 방법이 있나요 ? 내 말은 이것이다:
다음 줄이 있습니다.
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
호출된 파일의 패턴을 적용한 다음 비어 있지 않은지 여부에 따라 결과에 두 번째 패턴을 적용하거나 통과 필터 역할을 합니다.$term1
file
$term2
grep
cat
이는 비어 있을 때 " "로 변질되는 것을 제외하고 " term1
AND term2
"를 효과적으로 구현합니다 .term2
term1
전혀 실행하고 싶지 않지만 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