[a-z] +,[A-Z] +,[0-9] +和awk中的标志命令

时间:2014-01-29 07:33:17

标签: regex awk flags

我试图了解awk中的一些命令,这些命令与If statement inside awk to change a value问题有关。

输入文件是

...
MODE P E
IMP:P 1 19r 0
IMP:E 1 19r 0
...
SDEF POS= 0 0 14.6 AXS= 0 0 1 EXT=d3 RAD= d4 cell=23 ERG=d1 PAR=2
SI1 L  0.020
SP1    1
SI4 0. 3.401                                                                    
SI3 0.9 
...
NPS 20000000

,代码是

#! /bin/bash

vals=(0.02 0.04)

for val in "${vals[@]}"; do
awk -v val="$val" '
  BEGIN { i=1; split (val,v," ") }
  # If it is a string, find the sequence SI1 L and change the value after that, using values that the user inputs
  /SDEF POS.*ERG=[a-zA-Z]+/ { flag="y" ; }
  /SI1 L/ { if (flag=="y") { $3=v[i]; i++; flag="n"; } }
  # If it is a number, change the number using values that the user inputs.
  /SDEF POS.*ERG=[0-9]+ / { sub(/ERG=[0-9]*/, "ERG="v[i],$0);i++; }
  1
' 20small > "${val}"
done

我试图理解以下

  1. 为什么在[a-z][A-Z][0-9]之后有+个符号?我可以理解这些命令在定义的序列之后搜索任何字母和数字,但我似乎不明白+做了什么。
  2. flag究竟做了什么?我可以理解,/<expresion>/ flag="y"“将<expresion>替换为y。我似乎无法理解改变旗帜的原因如下几行。它是否像假旗?
  3. / /究竟做了什么?我知道这声明了搜索模式。为什么要添加SDEFPOS?只是为了确定它是正确的线?我也发现混淆使用.*。这是否意味着查找SDEF POS行并在同一行查找ERG,无论它们之间是什么/SDEF POS.*ERG=[a-zA-z]+/究竟做了什么?
  4. 我是awk的新手,所以我试图通过示例来学习它。帮助会更受欢迎!

1 个答案:

答案 0 :(得分:3)

  1. +表示一次或多次重复。例如,a+将匹配a aa aaaa*+匹配,但也不会a < / p>

  2. 标志用作临时信息持有者。

  3. / /是正则表达式持有者,用于表明它必须与两个/

  4. 中的正则表达式匹配

    我建议您查看一些awk一个内衬,并尝试了解它们的工作原理。首先阅读一些awk教程。您可以使用Google找到很多。