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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (34)

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

$ 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并重用结果:

$ filenum=$(show | sed -n 's/.*\<\([0-9]*\)=ghi\>.*/\1/p')
$ show | sed -n 's/file '"$filenum"'  \([a-z]*\)/\1/p'
watermelon

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

$ 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命令的输出中打印相关的单词。例如:

$ show | magic-command "ghi"
watermelon
$ show | magic-command "abc"
tomato
$ show | magic-command "def"
banana

show命令的格式如下:

file <filenum>  <word>
...

file name <filenum>=<filename> ...
提问于
用户回答回答于
$ cat tst.awk
/=/ {
    for (i=1; i<=NF; i++) {
        if ( split($i,f,/=/) == 2 ) {
            name2nr[f[2]] = f[1]
        }
    }
    next
}
{ nr2text[$2] = $3 }
END { print nr2text[name2nr[name]] }

使用cat file(其中file包含show问题中提供的输出)代替show

$ cat file | awk -v name='ghi' -f tst.awk
watermelon

如果文件名可以包含=或空格,则上述将失败。如果发生这种情况,那么你需要告诉我们如何识别文件名而不是字段和/或赋值语句。

用户回答回答于

根据OP添加解决方案,OP需要与其他程序一起运行,然后尝试跟随。

cat script.ksh
your_command | awk  -v command="$1" -F' +|=' '
/^file/ && !/^file name/{
  a[$2]=$NF
}
/^file name/{
  for(i=3;i<=NF;i+=2){
    array[$i]=$(i+1)}
}
/^ +/{
  for(j=2;j<=NF;j+=2){
    array[$j]=$(j+1)}
}
END{
  for(i in array){
    if(array[i]==command){  print array[i],a[i]  }
}}'

以下是我们运行脚本时的输出。

./script.ksh "ghi"
ghi watermelon

awk -F' +|=' '
FNR==NR{
  if($0 ~ /file name/){
    for(i=3;i<=NF;i+=2){
      array[$i]=$(i+1)
    }
    getline
    for(j=2;j<=NF;j+=2){
      array[$j]=$(j+1)
    }
  }
  next
}
($2 in array){
  print array[$2],$NF
}'   Input_file  Input_file

输出如下。

def banana
jkl apple
ghi watermelon
abc tomato
ghi jkl

考虑到你的show函数输出到Input_file这里,我在这里读取Input_file 2次。

扫码关注云+社区

领取腾讯云代金券