Regex awk中的[a-z]+、[a-z]+、[0-9]+和标志命令

Regex awk中的[a-z]+、[a-z]+、[0-9]+和标志命令,regex,awk,flags,Regex,Awk,Flags,我试图理解awk中的一些命令,它们与问题有关 输入文件是 ... 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

我试图理解awk中的一些命令,它们与问题有关

输入文件是

...
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
我试图理解以下几点

为什么在[a-z]、[a-z]和[0-9]之后有+符号?我可以理解这些命令在定义的序列之后搜索任何字母和数字,但我似乎不理解+的作用。 flag到底做什么?我可以理解//flag=y将替换为y。我似乎不明白为什么要在下面几行更改国旗。它像一面假旗吗? 他到底做什么?我知道这声明了搜索模式。为什么要添加SDEF和POS?只是为了确定这是正确的线路?我还发现。*的使用令人困惑。这是否意味着找到SDEF POS行并在同一行上查找ERG,无论它们之间是什么?/SDEF POS.*ERG=[a-zA-z]+/do到底是什么? 我是awk的新手,所以我正在尝试通过例子来学习。我更欢迎你的帮助

+指一次或多次重复。例如,a+将匹配aa aaa等。a*匹配与+,但也不匹配a

标志用作临时信息持有者

//is regex holder,用于表示它必须与两个/

我建议你看看一些awk一行程序,试着了解它们是如何工作的。也可以从阅读一些awk教程开始。你可以通过谷歌找到很多东西

+指一次或多次重复。例如,a+将匹配aa aaa等。a*匹配与+,但也不匹配a

标志用作临时信息持有者

//is regex holder,用于表示它必须与两个/


我建议你看看一些awk一行程序,试着了解它们是如何工作的。也可以从阅读一些awk教程开始。您可以通过谷歌找到很多信息。

非常感谢您的回答!还有更多的问题。为什么要添加新标志,即标志=n?这是一个无用的信息,不是吗?除此之外,还有什么可以做的呢。做例如/SDEF POS.*ERG=[a-zA-Z]+do是什么?。表示任何字符。标志从y yes更改为n no,以告知其已完成某些操作,以防止重复。我喜欢0或1的标志,但任何东西都可以/SDEF POS.*ERG=[0-9]+/mans是以SDEF POS开头的文本,然后是一些或多个未知字符。*然后ERG=然后是一个或多个数字[0-9]+。Eks它将匹配此行数据SDEF POSME TOERG=3445356我明白了!!!它的意思是是或不是。。。现在它有了完美的意义!!!非常感谢你!!!非常感谢您的回答!还有更多的问题。为什么要添加新标志,即标志=n?这是一个无用的信息,不是吗?除此之外,还有什么可以做的呢。做例如/SDEF POS.*ERG=[a-zA-Z]+do是什么?。表示任何字符。标志从y yes更改为n no,以告知其已完成某些操作,以防止重复。我喜欢0或1的标志,但任何东西都可以/SDEF POS.*ERG=[0-9]+/mans是以SDEF POS开头的文本,然后是一些或多个未知字符。*然后ERG=然后是一个或多个数字[0-9]+。Eks它将匹配此行数据SDEF POSME TOERG=3445356我明白了!!!它的意思是是或不是。。。现在它有了完美的意义!!!非常感谢你!!!