所以假设
(1)
我想问点以下内容:
锗 德语 germanland
从此列表中:
锗 德语 germanland germanistan germanburg
如何使用grep执行此操作?
(2)
我想grep一个以“abcd”开头的字符串,然后是中间的一些东西,然后是“xkcd”。任何东西都可以在中间,除了“foobar”。
如何使用grep执行此操作?
非常感谢!
答案 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的好资源:linuxquestions和cyberciti。
答案 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