www.
다음으로 시작하지 않고 다음을 포함하지 않는 문자열을 추출하는 다음 명령이 있습니다 /
.
grep -v -e '^www\.' -e '/' test2.txt
somestring.somestring
그러나 다음 명령을 사용하여 달성할 수 있는 일치 패턴 외에도 위의 내용을 원합니다 .
grep -e '^[^\.]*\.[^\.]*$'
모든 서류를 한 줄에 넣는 방법은 무엇입니까?
답변1
grep
한 번의 호출로 역방향 일치와 순방향 일치를 결합 할 수 없습니다.
당신은 이것을 할 수 있습니다 sed
:
sed -e '/^www\./d' -e '/\//d' -e '/^[^.]*\.[^.]*$/!d' ./*.txt
또는 awk
( sed
일치하는 파일의 이름을 인쇄할 수 있는 것과 반대 grep
):
awk -F. 'NF == 2 && !/^www\./ && !/\// {print FILENAME": "$0}' ./*.txt
파일 이름을 인쇄하지 않으려면 두 개의 grep 호출을 사용하여 이를 수행할 수 있습니다.
cat ./*.txt | grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'
cat
이는 표준 입력으로 모든 파일의 내용을 제공하는 데 사용되므로 첫 번째 파일은 grep
파일 이름을 인쇄하지 않습니다. 일부 구현에서는 파일이 여러 개 있는 경우 grep
파일 이름 인쇄를 건너뛰어야 합니다 . grep -h
파일 이름이 하나만 있는 경우 grep
파일 이름은 인쇄되지 않으며 리디렉션을 통해 표준 입력에 공급할 수 있습니다.
<onefile.txt grep '^[^.]*\.[^.]*$' | grep -v -e / -e '^www\.'
이를 지원하는 경우 PCRE의 (?!...)
부정 예측 연산자를 사용하여 부정을 달성할 수 있습니다.grep
-P
grep '^(?!www\.)(?!.*/)[^.]*\.[^.]*$' ./*.txt
하지만 여기서는 다음과 같이 모든 작업을 수행할 수 있습니다 -v
.
grep -v -e / -e '^www\.' -e '^[^.]*$' -e '\..*\.'
또한 포인트가 없는 행과 여러 포인트가 포함된 행도 제외됩니다.
답변2
첫 번째 grep
결과를 두 번째 결과로 파이프합니다 grep
.