我有以下命令来提取不以 开头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
。