Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 使用sed或awk从具有特定单词的行中提取第n行?_Regex_Bash_Shell_Awk_Sed - Fatal编程技术网

Regex 使用sed或awk从具有特定单词的行中提取第n行?

Regex 使用sed或awk从具有特定单词的行中提取第n行?,regex,bash,shell,awk,sed,Regex,Bash,Shell,Awk,Sed,终端上的hg标签输出: tip 596:bb834c42599f P_SONY_1004.21.15 595:db10157b1515 P_PHILIPS_1000.21.2 590:67b7e71f76b4 P_SONY_1004.21.2 539:2b50e157e217 P_SONY_10015.21.2 533:1

终端上的hg标签输出:

tip                              596:bb834c42599f
P_SONY_1004.21.15                595:db10157b1515
P_PHILIPS_1000.21.2              590:67b7e71f76b4
P_SONY_1004.21.2                 539:2b50e157e217
P_SONY_10015.21.2                533:15160fyafd88
P_creative.21.1                  512:cdac14a00df4
P_SONY_1004.15.5                 500:21affdf1bbfd
P_SONY_1002.15.5                 466:a7bad21505ca
P_SONY_1002.15.15                424:efbe741500bb
P_creative.15.2                  420:415c415a65fa
P_SONY_1004.15.1                 414:24f1ab415c15
P_PHILIPS_1000.15.1              412:5d151556c288
P_SONY_1002.15.1                 410:bf1f5af64ebb
P_SONY_1002.15.1                 390:152e0f4ec815
P_creative.8.2                   370:ecdc64f8a4b4
P_creative.8.1                   350:5b8e81bd725a
P_creative.7.5                   343:221d5c15efa6
P_creative.6.1                   222:62115db1e015
从这个输出中,我必须从包含“创造性”单词的行中提取第二行

我试过这个:

hg tags | awk '/creative/{print $1;}'
其产出:

P_creative.21.1
P_creative.15.2
P_creative.8.2
P_creative.8.1
P_creative.7.5
P_creative.6.1
但我只想将其作为输出: P_creative.15.2

如何更改命令以将“p_creative.15.2”作为输出,以及如何在shell脚本中使用它


我还可以从中提取“15.2”吗?

对于第二个实例:

hg tags | awk '/creative/{print $1;}' | head -2 | tail -1
n=2
hg tags | awk '/creative/{print $1;}' | head -$n | tail -1
更一般地说,$n标识所需的实例:

hg tags | awk '/creative/{print $1;}' | head -2 | tail -1
n=2
hg tags | awk '/creative/{print $1;}' | head -$n | tail -1

您可以
c
根据需要获得
c
th匹配:

awk -v c=2 '/creative/{count++;}count==c{print $0;exit}' file
(以上将打印整行)

要获得第一个单词:

awk -v c=2 '/creative/{count++;}count==c{print $1;exit}' file
像这样:

awk '/creative/{if(++p==2){gsub(/.*creative./,"");print $1;exit}}' f
要将结果分配给变量,请使用此
$()

这可能适用于您(GNU-sed):

将保留空间用作标志。可以调整:

sed -nr '/creative/{H;x;/^(\n[^\n]*){5}/{x;p;q};x}' file
找到这样的第五行。

另一种方法:

awk '/creative/{print $1;}' yourfile | sed -n '2p'
要获取唯一版本,请执行以下操作:

awk '/creative/{print $1;}' yourfile | sed -n '2s/[^.]*\.\(.*\)/\1/p'
测试

$ awk '/creative/{print $1;}' file | sed -n '2p'
P_creative.15.2
$ awk '/creative/{print $1;}' file | sed -n '2s/[^.]*\.\(.*\)/\1/p'
15.2

比我自己的要好得多。@Blue Moon-它将“P_creative.15.2 420:415c415a65fa”作为输出,我只想要“P_creative.15.2”,您可以打印
$1
而不是
$0
。编辑了我的答案<代码>$0代表整条线
$1
是第一个单词,
$2
是第二个单词,依此类推。如果您想使用不同的分隔符进行匹配,可以使用
-F
@BlueMoon以及如何从中仅提取数字(15.2)进行匹配this@Patrick
awk-F'.-vc=2'/creative/{count++;}count==c{print$2;exit}文件
将用于示例输入。如果输入的格式发生更改,则可能需要相应地更改打印的字段或分隔符。不太好。选择一个“所有awk”答案。如何在shell中编写此答案script@Patrick:将命令放入文件并添加
#/usr/bin/env sh
作为第一行。使文件可执行。如果您在shell脚本的多个位置需要该功能,请将其放在函数中。这里有很多教程——关于“sh scripting”的第一个google结果让我想到了这一点:我如何用变量替换creative,这样我的代码才能正常工作您需要对awk脚本使用双引号,以便扩展shell变量,并在
print$1
中转义
$
。将命令更改为
hg tags | awk”/$PATTERN/{print\$1;}“| head-$n | tail-1
。设置
PATTERN=creative
将导致相同的行为。此代码是否用于提取“15.2”?但其打印的是整个“P_creative.15.2”,请检查您的代码我已对其进行了简化和改进-请重试。如何在shell脚本中使用此代码?如果必须用环境变量替换此“creative”,我尝试了这个$BRANCH=$1版本=$(awk'/$BRANCH/{if(++p==2){gsub(/.*$BRANCH./,“”);打印$1;退出}}'f)