在KornShell中选择两个单词之间的字符串

时间:2014-01-08 16:06:28

标签: shell scripting sed grep ksh

我想只从一行中选择匹配的字符串。 这是我的测试字符串:

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

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

但它给出了这样的,

  • “我正在使用基本的grep express”

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

2 个答案:

答案 0 :(得分:0)

您需要在正则表达式中添加字锚

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

该命令不产生任何输出。

零长度锚\>仅在左边的字符是“字符”(字母,数字,下划线)时才匹配,右边的字符是“非单词字符”。类似于\<

ref 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

答案 1 :(得分:0)

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

取决于你的意思:

  • 整行以am开头,以express

    结尾

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

  • 包含am,稍后会跟express

    sed -n“/am.*express/ p”

在几行(在这种情况下最多2个)

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

特别是使用超过3行的文件的最后一行快递进行测试