如何grep字符串的替换结尾

时间:2011-03-24 19:36:12

标签: regex grep

所以假设

(1)

我想问点以下内容:

  

锗   德语   germanland

从此列表中:

  

锗   德语   germanland   germanistan   germanburg

如何使用grep执行此操作?

(2)

我想grep一个以“abcd”开头的字符串,然后是中间的一些东西,然后是“xkcd”。任何东西都可以在中间,除了“foobar”。

如何使用grep执行此操作?

非常感谢!

5 个答案:

答案 0 :(得分: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解释为扩展正则表达式。对于以*ia结尾的字词,land符号表示找到0个或多个匹配。以概念结尾的单词的由最后的$符号表示。

这些是关于grep和regex的好资源:linuxquestionscyberciti

答案 1 :(得分:1)

关于你的第二个问题:

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

答案 2 :(得分:1)

老问题,但我还以为我会发表评论。 Karlphilip的答案是有效的,但有副作用,将线分成多行并分别回显它们。我不确定Deniz想要的是什么。

我读这个问题的方式是,如果它包含任何不同的单词“german”,“germania”或“germanland”,他希望grep找到该行。

此解决方案类似,但不进行拆分:

$ echo "germanialand germanistan germanburg germania" | grep -E "\<german(ia|land|)\>"
germanialand germanistan germanburg germania

$ echo "germanistan germanburg germaniaburg" | grep -E "\<german(ia|land|)\>"
$

答案 3 :(得分:0)

由于信息不足,对于您的第一个问题,因为您想获得的是前3个字段,那么只需

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

第二个问题,

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

答案 4 :(得分:0)

关于第二个问题:lngo大多是正确的,除了他希望字符串开始与&#34; abcd&#34; 结束与xkcd。

我对这个问题的解释也有所不同,因为我认为他想在开头(abcd)和关闭(xkcd)之间排除任何东西,其中有一个foobar,而不是一个foobar

grep '^abcd.*xkcd$' | grep -v foobar