我试图从我在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
答案 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'