답변:
"같은 줄에 둘 다"는 "쌀"다음에 임의의 문자 다음에 "레몬"또는 다른 방법이 따른다는 것을 의미합니다.
정규식에서 rice.*lemon
또는 lemon.*rice
입니다. 다음을 사용하여 결합 할 수 있습니다 |
.
grep -E 'rice.*lemon|lemon.*rice' some_file
확장 정규 표현식 ( -E
) 대신 일반 정규 표현식을 사용 하려면 다음 앞에 백 슬래시가 필요합니다 |
.
grep 'rice.*lemon\|lemon.*rice' some_file
조금 더 빨리 길어지고 일반적으로의 여러 호출을 사용하는 것이 더 쉬운 단어는 다음과 grep
같습니다.
grep rice some_file | grep lemon | grep chicken
grep rice
포함 된 줄을 찾습니다 rice
. grep lemon
레몬이 들어있는 라인 만 찾을 수있는 곳으로 공급됩니다 . 뿐만 아니라 이전의 답변 - - 영업 반면 허용하고 있는 [닭 | | 레몬 쌀]의
|
탈출해야 grep
하는가? 감사!
egrep
는 |
OR 논리로 이해되는 확장 정규식을 사용합니다 . grep
기본 정규 표현식으로 기본 설정되어 있습니다. 여기서 \|
OR
grep
맨 페이지에 명시된 바와 같이 egrep
더 이상 사용되지 않으며로 대체되어야합니다 grep -E
. 그에 따라 답을 자유롭게 편집 할 수있었습니다.
첫 번째 grep 명령의 출력을 다른 grep 명령으로 파이프하면 두 패턴과 모두 일치합니다. 따라서 다음과 같은 작업을 수행 할 수 있습니다.
grep <first_pattern> <file_name> | grep <second_pattern>
또는,
cat <file_name> | grep <first_pattern> | grep <second_pattern>
파일에 내용을 추가해 봅시다 :
$ echo "This line contains lemon." > test_grep.txt
$ echo "This line contains rice." >> test_grep.txt
$ echo "This line contains both lemon and rice." >> test_grep.txt
$ echo "This line doesn't contain any of them." >> test_grep.txt
$ echo "This line also contains both rice and lemon." >> test_grep.txt
파일에 포함 된 내용 :
$ cat test_grep.txt
This line contains lemon.
This line contains rice.
This line contains both lemon and rice.
This line doesn't contain any of them.
This line also contains both rice and lemon.
자, 우리가 원하는 것을 grep합시다 :
$ grep rice test_grep.txt | grep lemon
This line contains both lemon and rice.
This line also contains both rice and lemon.
우리는 두 패턴이 일치하는 선만 얻습니다. 이를 확장하고 추가 "AND"일치를 위해 출력을 다른 grep 명령으로 파이프 할 수 있습니다.
-P
(Perl-Compatibility) 옵션과 긍정적 인 미리보기 정규식을 사용(?=(regex))
하여 grep :
grep -P '(?=.*?lemon)(?=.*?rice)' infile
또는 대신 아래를 사용할 수 있습니다.
grep -P '(?=.*?rice)(?=.*?lemon)' infile
.*?
모든 문자와 일치하는 수단이 .
사건은 시간을 0 개 이상의 것을 *
그들이 패턴 (다음에 선택하는 동안 rice
또는 lemon
). 는 ?
이 (수단이 제로 또는 모든 것을 한 시간이 일치하기 전에 모든 것을 선택한다 .*
)(?=pattern)
: Positive Lookahead : Positive lookahead 구문은 괄호 쌍으로, 여는 괄호 뒤에 물음표와 등호가옵니다.
모두 포함하여 그래서이 모든 행을 반환 lemon
하고 rice
임의의 순서로. 또한 이것은 |
s와 doubles 를 사용하지 않도록 grep
합니다.
grep 배관 솔루션을 자동화하는 스크립트는 다음과 같습니다.
#!/bin/bash
# Use filename if provided as environment variable, or "foo" as default
filename=${filename-foo}
grepand () {
# disable word splitting and globbing
IFS=
set -f
if [[ -n $1 ]]
then
grep -i "$1" ${filename} | filename="" grepand "${@:2}"
else
# If there are no arguments, assume last command in pipe and print everything
cat
fi
}
grepand "$@"
eval
쉽게, 어떤 나누기를 보내고