2014-01-08 63 views
0

我想只选择一行中的匹配字符串。 这是我的测试字符串:在KornShell中选择两个单词之间的字符串

  • “我正在使用基本的grep表达式。”

我想要从“am”开始并以“express”结尾的字符串。但是在上面提到的那一行中,我的结尾词不在那里,而不是那个“表达”在那里。 我为此使用了以下命令。 echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*express\).*/\1/p"

但它给这个样子,

  • “现在用grep的基本表达”

理想情况下,不应该放弃任何输出按我的要求。任何人都可以为此提出解决方案吗?

回答

0

您需要字锚添加到您的正则表达式:

grep -o '\<am\>.*\<express\>' <<END 
I am using basic grep expression. 
END 

该命令不产生输出。

仅当左边的字符是“单词字符”(字母,数字,下划线)并且右边的字符是“非单词字符”时,零长度定位符\>才会匹配。为\<

参考类似http://man.cx/regexp(5)


如果你没有GNU的grep,perl的将工作做好

perl -lne 'print $1 while /(\bam\b.*?\bexpress\b)/g' <<END 
I am using basic grep expression. 
but here I am in the express lane at the grocery store and am further on express time. 
not here 
END 
am in the express 
am further on express 
+0

文件的最后一行快递尤其是测试Hi..I想你的代码如下..但它无法正常工作。你可以考虑一下吗? – user3173463

+0

回声“我正在使用基本的grep表达式”| grep'\ 。* \ ' – user3173463

+0

在HP UNIX中,grep -o不存在。所以请为此建议一个替代方案。 – user3173463

0
echo 'I am using basic grep expression.' | sed ... 

取决于你的意思是:

  • 全线开始amexpress

    sed的-n “/^am.*express$/ P”

  • 包含am结束,后来与express

    随后的sed - n“/am.*express/p”

on the number line(2 Max在这种情况下)

sed -n "/^am/ { 
    /am.*express$/ {p;b} 
: more 
    N 
    /am.*express$/ {p;b} 
    s/.*\n// 
    /am/ b more 
    }" 

要对3个以上的线

+0

谢谢......但是我的问题是,'express'这个词在下一行。你可以建议这是一个解决方案。 – user3173463

相关问题