如何使用grep查找字符串的备选结尾

3

假设

(1)

我想要用grep从以下列表中提取所需内容:

germania german germanland

列表如下:

germania german germanland germanistan germanburg

请问如何使用grep实现此操作?

(2)

我想要用grep查找以“abcd”开头,中间有一些内容,并以“xkcd”结尾的字符串。 中间可以放置任何内容,但是不能包含“foobar”。

请问如何使用grep实现此操作?

非常感谢!


2
这个定义不是很清晰。如果这是两个不同的问题,你应该分别提出两个问题。但说实话,我无法理解你在问什么,所以我不确定它们是否为两个问题。 - Daniel DiPaolo
在第二个问题中,abcdofoobari-xkcd 应该被包含吗? - user unknown
5个回答

3
下面的sed命令只是为了将字符串分成几行:
echo "germania german germanland germanistan germanburg" | sed -e 's/\ /\n/g' | grep -E "german*(ia|land|)$"

这是在bash命令行上测试的。
对于您而言,重要的部分是:grep -E "german(ia|land)*$" -E 表示将 PATTERN 解释为扩展正则表达式。 * 符号表示查找以 ialand 结尾的单词,且可以匹配 0 个或多个结果。以“结束”概念表示为结尾的 $ 符号。
这些都是关于 grep 和正则表达式的好资源: linuxquestionscyberciti

你测试过这个吗?我建议使用egrep模式应该是'german(ia|land)*$'(注意撇号以防止$替换)。 - Ingo
echo "germannia germa germannland germannistan germanburg" | sed -e 's/\ /\n/g' | grep -E "german*(ia|land|)$" - german*表示n是可选的,并且可以重复。 - user unknown

1

虽然这是一个老问题,但我还是想发表一下评论。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|)\>"
$

1

针对你的第二个问题:

grep -v 'abcdfoobarxkcd' | grep 'abcd.*xkcd'

0

由于信息不足,对于您的第一个问题,既然您想要获取的是前三个字段,那么只需

awk '{print $1,$2,$3}' file

对于第二个问题,

awk '/^abcd.*xkcd/ && !/foobar/' file

0
关于第二个问题:lngo大部分是正确的,除了他想要字符串以“abcd”开头和以“xkcd”结尾。
我对这个问题的解释也有些不同,我认为他想要排除在开放(abcd)和关闭(xkcd)之间有一个foobar的任何内容,而不仅仅是一个foobar。
grep '^abcd.*xkcd$' | grep -v foobar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接