从linux中的字符串中过滤出一个子串只一次

时间:2014-07-24 15:26:23

标签: linux sed substring

我试图从我在linux中使用sed命令的字符串中提取一个特定的子字符串。但是,问题是在命令第一次返回子字符串后,我再次在字符串中查找起始关键字。

我想跳过最后一部分。我只想要关键字之间的第一个子串。

字符串: bhaskar.txt

bhaskar
rahul
gaurav
ganesh
bhaskar
rahul

需要子串: “bhaskar”和“ganesh”之间的所有内容

使用的命令:sed -n '/bhaskar/,/ganesh/p' bhaskar.txt

输出:

bhaskar
rahul
gaurav
ganesh
bhaskar
rahul

预期产出:

bhaskar
rahul
gaurav
ganesh

3 个答案:

答案 0 :(得分:3)

以下是你在awk中的表现:

awk '/bhaskar/ && !p++, /ganesh/' bhaskar.txt

第一次/bhaskar/匹配时,p尚未定义,因此!p为真且范围开始。 p++表示在检查完值后,将p增加1.范围将一直持续到/ganesh/匹配。

第一个范围完成后,如果/bhaskar/再次匹配,则p将为正,因此!p将评估为false,范围不会重新启动。

输出:

bhaskar
rahul
gaurav
ganesh

这是你可以做的另一种方式,有些人可能更喜欢:

awk '/bhaskar/ {p=1} p {print} /ganesh/ {exit}' bhaskar.txt

可以说是更加不言自明,只要p匹配就会设置变量/bhaskar/,设置变量p时打印,{{1}时退出(打印后) }匹配。

答案 1 :(得分:0)

使用awk

awk -v a=bhaskar -v b=ganesh '$0 == a { p = 1; t = "" }; $0 == b && p { printf "%s%s\n", t, b; p = 0 }; p { t = t $0 ORS }' file

输出:

bhaskar
rahul
gaurav
ganesh

答案 2 :(得分:0)

使用sed,您需要使用循环:

sed -n '/bhaskar/{: loop; p; /ganesh/q; n; b loop}' bhaskar.txt

第二个想法,不是这样,你只需要在范围的最后退出:

sed -n '/bhaskar/,/ganesh/p; /ganesh/q'