我想只从一行中选择匹配的字符串。 这是我的测试字符串:
我想要从“am”开始并以“express”结尾的字符串。但是在上面提到的行中,我的结尾词不存在,而不是那个“表达”。
我使用了以下命令。
echo 'I am using basic grep expression.' | sed -n "s/.*\(am.*express\).*/\1/p"
但它给出了这样的,
理想情况下,它不应该按照我的要求提供任何输出。任何人都可以为此提出解决方案吗?
答案 0 :(得分:0)
您需要在正则表达式中添加字锚:
grep -o '\<am\>.*\<express\>' <<END
I am using basic grep expression.
END
该命令不产生任何输出。
零长度锚\>
仅在左边的字符是“字符”(字母,数字,下划线)时才匹配,右边的字符是“非单词字符”。类似于\<
如果你没有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行的文件的最后一行快递进行测试