首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >regex:重用匹配结果以获得相同输出的另一个匹配?

regex:重用匹配结果以获得相同输出的另一个匹配?
EN

Stack Overflow用户
提问于 2018-07-12 10:33:45
回答 2查看 119关注 0票数 1

我有一个返回输出的命令:

代码语言:javascript
复制
$ show
file 1  banana
file 3  apple
file 2  watermelon
file 0  tomato

file name 0=abc 1=def
          2=ghi 3=jkl

使用给定的文件名,我希望找到相关的单词。例如,ghi将与watermelon匹配。

我可以用sed匹配文件编号并重用结果:

代码语言:javascript
复制
$ filenum=$(show | sed -n 's/.*\<\([0-9]*\)=ghi\>.*/\1/p')
$ show | sed -n 's/file '"$filenum"'  \([a-z]*\)/\1/p'
watermelon

show的输出计算起来可能会很长,所以我想避免两次调用它。还可以将输出存储在变量中并执行相同的操作:

代码语言:javascript
复制
$ out=$(show)
$ filenum=$(echo "$out" | sed -n 's/.*\<\([0-9]*\)=ghi\>.*/\1/p')
$ echo "$out" | sed -n 's/file '"$filenum"'  \([a-z]*\)/\1/p'
watermelon

但是我想用最少的命令来做这件事。

只需调用一次sedawk或任何类似的实用程序就可以达到相同的结果吗?

我想要一个命令magic-command,对于给定的文件名,在show命令的输出中打印相关的单词。例如:

代码语言:javascript
复制
$ show | magic-command "ghi"
watermelon
$ show | magic-command "abc"
tomato
$ show | magic-command "def"
banana

show命令的格式如下:

代码语言:javascript
复制
file <filenum>  <word>
...

file name <filenum>=<filename> ...

EDIT 2谢谢你的回答,我以前从来没有用过awk,所以我学到了很多,谢谢你!因此,我对它们进行了修补,并最终得到了以下结果:

代码语言:javascript
复制
$ cat magic-command.sh
#!/bin/sh
awk '
# Match the `<filenum>=<filename>` using the given <filename>
# to find to <filenum>
match($0, /([0-9]*)='"$1"'/, out ) {
  filenum=out[1]
}
# Fill n2name using the `file <filenume>  <word>` lines
/\<file [0-9]*\>/ {
  n2name[$2]=$3
}
END {
  print n2name[filenum]
}'

然后:

代码语言:javascript
复制
$ show | ./magic-command.sh "ghi"
watermelon
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51296561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档