假设
(1)
我想要用grep从以下列表中提取所需内容:
germania german germanland
列表如下:
germania german germanland germanistan germanburg
请问如何使用grep实现此操作?
(2)
我想要用grep查找以“abcd”开头,中间有一些内容,并以“xkcd”结尾的字符串。 中间可以放置任何内容,但是不能包含“foobar”。
请问如何使用grep实现此操作?
非常感谢!
echo "germania german germanland germanistan germanburg" | sed -e 's/\ /\n/g' | grep -E "german*(ia|land|)$"
grep -E "german(ia|land)*$"
-E
表示将 PATTERN 解释为扩展正则表达式。 *
符号表示查找以 ia
或 land
结尾的单词,且可以匹配 0 个或多个结果。以“结束”概念表示为结尾的 $
符号。echo "germannia germa germannland germannistan germanburg" | sed -e 's/\ /\n/g' | grep -E "german*(ia|land|)$"
- german*表示n是可选的,并且可以重复。 - user unknown虽然这是一个老问题,但我还是想发表一下评论。Karlphilip的答案是可行的,但会将该行拆分为多行并单独回显它们。我不确定这是否符合Deniz的要求。
我理解问题的方式是,如果该行包含任何“德国”,“日耳曼尼亚”或“日耳曼兰”这些不同单词的出现,则希望grep找到该行。
这个解决方案类似,但不会进行拆分:
$ echo "germanialand germanistan germanburg germania" | grep -E "\<german(ia|land|)\>"
germanialand germanistan germanburg germania
$ echo "germanistan germanburg germaniaburg" | grep -E "\<german(ia|land|)\>"
$
针对你的第二个问题:
grep -v 'abcdfoobarxkcd' | grep 'abcd.*xkcd'
由于信息不足,对于您的第一个问题,既然您想要获取的是前三个字段,那么只需
awk '{print $1,$2,$3}' file
对于第二个问题,
awk '/^abcd.*xkcd/ && !/foobar/' file
grep '^abcd.*xkcd$' | grep -v foobar
abcdofoobari-xkcd
应该被包含吗? - user unknown