这是 awkposix 命令,可以使用我们的多个免费在线工作站之一(例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器)在 OnWorks 免费托管提供商中运行
程序:
您的姓名
awk — 模式扫描和处理语言
概要
AWK [-F 七弦琴] [-v 分配]... 程序 [论点...]
AWK [-F 七弦琴] -f 配置文件 [-f 配置文件]... [-v 分配]...
[论点...]
商品描述
这个 AWK 实用程序应执行编写的程序 AWK 编程语言,即
专门用于文本数据操作。 一个 AWK 程序是一系列模式和
相应的动作。 当读取与模式匹配的输入时,关联的操作
以该模式进行。
输入应被解释为记录序列。 默认情况下,一条记录是一行,少
它的终止,但这可以通过使用来改变 RS 内置变量。 每个
输入记录应依次与程序中的每个模式进行匹配。 对于每个
模式匹配,则应执行关联的操作。
这个 AWK 实用程序应将每个输入记录解释为一系列字段,其中,
默认情况下,字段是一个非字符串非人物。 这个默认的
和可以使用以下命令更改字段分隔符 FS 内置变量或 -F
七弦琴 选项。 该 AWK 实用程序应表示记录 $1 中的第一个字段,第二个字段
2 美元,等等。 符号 $0 指的是整个记录; 设置任何其他字段
导致重新评估 $0。 分配给 $0 将重置所有其他字段的值
和 NF 内置变量。
配置
这个 AWK 实用程序应符合 POSIX.1-2008 的基本定义卷, 部分
12.2, 公用事业 句法 指南.
应支持以下选项:
-F 七弦琴
定义输入字段分隔符。 该选项应等效于:
-v FS =七弦琴
除了如果 -F 七弦琴 和 -v FS =七弦琴 两者都使用,未指定
是否 FS 分配产生于 -F 七弦琴 在命令中处理
行订单或在最后一个之后处理 -v FS =七弦琴. 看说明
的 FS 扩展描述中的内置变量及其使用方式
部分。
-f 配置文件
指定文件的路径名 配置文件 包含 AWK 程序。 路径名
of '-' 应表示标准输入。 如果此选项有多个实例
指定,文件的串联指定为 配置文件 按顺序
指定应为 AWK 程序。 该 AWK 程序也可以是
在命令行中指定为单个参数。
-v 分配
申请应确保 分配 参数的形式与
an 分配 操作数。 指定的变量赋值应发生在
执行 AWK 程序,包括与相关的操作 BEGIN 模式
(如果有的话)。 可以指定此选项多次出现。
操作数
应支持以下操作数:
程序 如果不 -f 指定选项时,第一个操作数为 AWK 的文本应为
AWK 程序。 申请应提供 程序 作为单个操作数
争论 AWK。 如果文本不以 a 结尾, AWK 应解释
文本就好像它一样。
论点 以下两种类型中的任何一种 论点 可以混合使用:
文件 包含要读取的输入的文件的路径名,即
与程序中的一组模式相匹配。 如果不 文件
指定了操作数,或者如果 文件 操作数是 '-', 标准
应使用输入。
分配
以 a 开头的操作数或字母字符
来自可移植字符集(请参阅基本定义中的表
POSIX.1-2008 卷, 部分 6.1, 便携版 字符 选择),随后
由一系列下划线、数字和字母组成
可移植字符集,后面跟着 '=' 字符,应指定一个
变量赋值而不是路径名。 前面的字符
'=' 代表一个名字 AWK 多变的; 如果这个名字是 AWK
保留字(参见 英语文法) 行为未定义。 那些角色
遵循应被解释为好像它们出现了
,在 AWK 程序前面和后面都有一个双引号 ('"')
角色,作为 STRING 令牌(参见 英语文法),除了如果最后一个
字符是未转义的,它应被解释为
文字而不是作为序列的第一个字符
"\""。 该变量应被赋予该变量的值 STRING 象征
并且,如果适当的话,应被视为 数字 绳子 (见
表达式 in AWK),变量也应被赋予其数字
价值。 每个这样的变量赋值应发生在
处理以下内容 文件,如果有的话。 因此,之前的分配
第一位 文件 参数应在之后执行 BEGIN 行动(如果
任何),而最后一个之后的分配 文件 争论将会发生
前 END 行动(如果有的话)。 如果没有 文件 论据,
分配应在处理标准输入之前执行。
标准输入
仅当没有时才使用标准输入 文件 指定了操作数,或者如果 文件
操作数是 '-',或者如果一个 配置文件 选项参数是 '-'; 请参阅输入文件部分。 如果
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 AWK 程序不包含任何操作和模式,但在其他方面是有效的 AWK 程序
标准输入和任何 文件 操作数不得被读取并且 AWK 将退出并返回
状态为零。
INPUT FILES
输入文件到 AWK 来自以下任何来源的程序应为文本文件:
* 任何 文件 操作数或其等价物,通过修改来实现 AWK 变量 无人驾驶汽车
和 农业研究中心
* 标准输入没有任何 文件 操作数
* 论据 函数getline function
是否变量 RS 被设置为 a 以外的值或不,对于这些文件,
实现应支持以指定分隔符终止的记录最多
{LINE_MAX} 字节,可能支持更长的记录。
If -f 配置文件 被指定,应用程序应确保由每个指定的文件
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 配置文件 选项参数是文本文件及其串联,顺序与
它们出现在参数中,是一个 AWK 程序。
环境 变数
以下环境变量会影响执行 AWK:
朗 为未设置或未设置的国际化变量提供默认值
空值。 (参见 POSIX.1-2008 的基本定义卷, 部分 8.2,
国际化 变量 为国际化优先
用于确定语言环境类别值的变量。)
LC_ALL 如果设置为非空字符串值,则覆盖所有其他字符串的值
国际化变量。
LC_COLLATE
确定范围、等价类和多变量行为的语言环境
正则表达式中的字符整理元素以及比较
字符串值。
LC_CTYPE 确定用于解释文本数据字节序列的语言环境
作为字符(例如,单字节而不是多字节字符
参数和输入文件),常规中字符类的行为
表达式、将字符识别为字母以及映射
大写和小写字符 上衣 和 降低 功能。
LC_消息
确定应该用于影响格式和内容的语言环境
写入标准错误的诊断消息。
LC_NUMERIC
确定解释数字输入时使用的基数字符,执行
数字和字符串值之间的转换,以及格式化数字输出。
无论区域设置如何, 字符(小数点字符
POSIX locale) 是处理中识别的小数点字符 AWK
程序(包括命令行参数中的赋值)。
路径 确定用于处理的消息目录的位置 LC_消息.
PATH 查找执行的命令时确定搜索路径 系统(表达式), 要么
输入和输出管道; 请参阅 POSIX.1-2008 的基本定义卷, 章节
8, 环境 变量.
此外,所有环境变量应通过 AWK 变量 环保.
异步 精彩活动
默认。
标准输出
输出文件的性质取决于 AWK 程序。
斯特德
标准错误应仅用于诊断消息。
OUTPUT FILES
输出文件的性质取决于 AWK 程序。
EXTENDED 商品描述
整体 教学计划 结构
An AWK 程序由以下形式的对组成:
模式 { 行动 }
模式或操作(包括括弧字符)可以是
省略。
缺失的模式应与任何输入记录相匹配,并且缺失的操作应为
相当于:
{ 打印 }
执行 AWK 程序应首先执行与
所有 BEGIN 模式按照它们在程序中出现的顺序排列。 然后每个 文件 操作数(或
标准输入(如果没有指定文件)应通过读取数据依次处理
文件直到看到记录分隔符( 默认情况下)。 在第一个之前
评估对记录中字段的引用,记录应分为字段,
根据规则 原价 表达式,使用的值 FS 目前在
读取记录的时间。 然后应在程序中评估每个模式
发生的顺序,以及与当前匹配的每个模式关联的操作
执行记录。 匹配模式的操作应在评估之前执行
随后的模式。 最后,与所有相关的操作 END 模式应为
按照它们在程序中出现的顺序执行。
表达式 in AWK
表达式描述了使用的计算 模式 和 行动。 在下表中,
有效的表达式运算按照从最高优先级到最低优先级的顺序分组给出
优先级最后,同等优先级运算符分组在水平线之间。 在
表达式求值,当语法形式上不明确时,优先级更高
运算符应在优先级较低的运算符之前进行评估。 在这个表中 表达式, 表达式1,
表达式2和 表达式3 代表任何表达式,而左值代表任何可以
分配给(即在赋值运算符的左侧)。 的精确语法
表达式给出在 英语文法.
表 4-1: 表达式 in 降低 优先权 in AWK
┌──────────────────────┬──────────────────────────┬─ ────────────────┬──────────────┐
│ 句法 │ 姓名 │ 类型 of 结果 │关联性 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│( 表达式 ) │分组 │类型 表达式 │不适用 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│$表达式 │字段参考 │字符串 │N/A │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│左值++ │后自增 │数值 │N/A │
│左值 −− │后减 │数值 │N/A │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│++ 左值 │预自增 │数字 │N/A │
│−− 左值 │预减 │数字 │N/A │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 ^ 表达式 │求幂 │数值 │右 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│! 表达式 │逻辑非 │数字 │N/A │
│+ 表达式 │一元加 │数字 │N/A │
│− 表达式 │一元减 │数字 │N/A │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 * 表达式 │乘法 │数值 │向左 │
│表达式 / 表达式 │除法 │数字 │左 │
│表达式 % 表达式 │模数 │数值 │左 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 + 表达式 │加法 │数字 │左移 │
│表达式 - 表达式 │减法 │数字 │左 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 表达式 │字符串连接 │字符串 │左 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 < 表达式 │小于 │数字 │无 │
│表达式 <= 表达式 │小于或等于 │数字 │无 │
│表达式 != 表达式 │不等于 │数字 │无 │
│表达式 == 表达式 │等于 │数字 │无 │
│表达式 > 表达式 │大于 │数字 │无 │
│表达式 >= 表达式 │大于或等于 │数字 │无 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 ~ 表达式 │ERE 匹配 │数字 │无 │
│表达式 !~ 表达式 │ERE 不匹配 │数字 │无 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 在数组中 │数组成员资格 │数字 │左 │
│( 指数 )in 排列 │多维数组 │数值 │左 │
│ │会员资格 │ │ │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 && 表达式 │逻辑与 │数值 │左 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式 || 表达式 │逻辑或 │数值 │左 │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│表达式1 ? 表达式2 : 表达式3│条件表达式 │选择的类型 │右 │
│ │ │表达式2 or 表达式3 │ │
├──────────────────────┼──────────────────────────┼─ ────────────────┼──────────────┤
│左值^= 表达式 │取幂赋值│数值│右运算│
│左值%= 表达式 │模数赋值 │数字 │右 │
│左值*= 表达式 │乘法赋值│数值│右运算│
│左值/= 表达式 │除法分配 │数字 │右 │
│左值+= 表达式 │加法作业 │数字 │右 │
│左值−= 表达式 │减法作业 │数字 │右 │
│左值= 表达式 │作业类型 │类型 表达式 │对 │
└──────────────────────┴──────────────────────────┴─ ────────────────┴──────────────┘
每个表达式应具有字符串值、数值或两者。 除非作为
对于特定上下文,表达式的值应隐式转换为
使用它的上下文所需的类型。 字符串值应转换为
一个数值,可以通过等效于以下对由定义的函数的调用来实现
ISO C 标准:
设置语言环境(LC_NUMERIC, “”);
数字值 = atof(字符串值);
或通过将字符串的初始部分转换为类型 翻番 表示为
如下:
输入字符串被分解为两部分:初始序列(可能为空)
空白字符(由 等距()) 和主题序列
解释为浮点常量。
主题序列的预期形式是可选的 '+' or '-' 标志,然后是一个
非空数字序列,可选地包含,然后是一个可选的
指数部分。 指数部分包括 'e' or 'E',后跟一个可选的
符号,后跟一位或多位十进制数字。
以第一个数字或(以先发生者为准)
被解释为 C 语言的浮点常量,如果两者都不是指数
部分也不是出现,一个假设跟随在最后一个数字之后
细绳。 如果主题序列以减号开头,则结果为
转换被否定。
完全等于整数值的数值(请参见 部分 1.1.2,
概念 派生 , 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 ISO C 标准版) 应通过等价转换为字符串
的电话 冲刺 功能(见 串 功能) 与字符串 “%d” 作为 fmt
参数和被转换为第一个且唯一的数值 表达式 争论。 任何
其他数值应通过等效于调用来转换为字符串
冲刺 函数与变量的值 转换 作为 fmt 论证和
作为第一个也是唯一一个被转换的数值 表达式 争论。 结果
如果值的转换未指定 转换 不是浮点格式
规格。 POSIX.1-2008 的本卷没有指定之间的显式转换
数字和字符串。 应用程序可以强制将表达式视为数字
向其添加零,或者可以通过连接 null 强制将其视为字符串
细绳 ("")到它。
字符串值应被视为 数字 绳子 如果它来自以下之一:
1. 字段变量
2. 输入来自 函数getline() 功能
3. 文件名
4. 无人驾驶汽车 数组元素
5. 环保 数组元素
6. 创建的数组元素 分裂() 功能
7. 命令行变量赋值
8.从另一个数字字符串变量进行变量赋值
与下面的情况 (a) 或 (b) 相对应的依赖于实现的条件是
满足。
A。 相当于以下对 ISO C 定义的函数的调用
标准, 字符串值结束 会不同于 字符串值,以及之前的任何字符
中的终止空字符 字符串值结束 将会人物:
坦克 *字符串值结束;
设置语言环境(LC_NUMERIC, “”);
数字值 = 斯特德 (字符串值, &字符串值结束);
b. 应用以下所有转换后,生成的字符串将
在词汇上被识别为 NUMBER 词汇约定中描述的标记
英语文法:
-- 所有前导和尾随字符被丢弃。
-- 如果第一个非是 '+' or '-',它被丢弃。
-- 当前语言环境中每次出现的小数点字符都会更改
到一个。
在情况 (a) 的数值 数字 绳子 应是该值
由返回 斯特德() 称呼。 在情况(b)中,如果第一个非是 '-', 数字
的价值 数字 绳子 应为已识别数值的否定
NUMBER 令牌; 否则,数值 数字 绳子 应为数字
被认可的价值 NUMBER 令牌。 字符串是否是 数字 绳子 应该
仅与本节中使用该术语的上下文相关。
当在布尔上下文中使用表达式时,如果它具有数值,则值为
零应被视为假,任何其他值应被视为真。 否则,一个
空字符串的字符串值应被视为 false,任何其他值应被视为
视为真实。 布尔上下文应是以下之一:
* 条件表达式的第一个子表达式
* 由逻辑 NOT、逻辑 AND 或逻辑 OR 运算的表达式
* a的第二个表达式 HPMC胶囊 声明
* 的表达式 if 声明
* 的表达式 而 子句中的任一 而 or do...而 声明
* 用作模式的表达式(如总体程序结构中所示)
所有算术都应遵循浮点算术的语义,如
ISO C 标准(参见 部分 1.1.2, 概念 派生 , 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 ISO C 标准版).
表达式的值:
表达式1 ^ 表达式2
应等于 ISO C 标准函数调用的返回值:
战俘(表达式1, 表达式2)
表达方式:
左值 ^= 表达式
应等效于 ISO C 标准表达式:
左值 = 战俘(左值, 表达式)
但左值只能计算一次。 表达式的值:
表达式1 % 表达式2
应等于 ISO C 标准函数调用的返回值:
fmod(表达式1, 表达式2)
表达方式:
左值 %= 表达式
应等效于 ISO C 标准表达式:
左值 = fmod(左值, 表达式)
但左值只能计算一次。
变量和字段应通过赋值语句设置:
左值 = 表达
和类型 表达 应确定结果变量类型。 分配
包括算术作业 (“+=”, “-=”, “*=”, “/=”, “%=”, “^=”, “++”, “--”) 全部
其中应产生一个数字结果。 作业的左侧和
递增和递减运算符的目标可以是变量、带索引的数组之一、
或字段选择器。
这个 AWK 语言提供用于存储数字或字符串的数组。 数组
无需声明。 它们最初应该是空的,并且它们的大小将会改变
动态地。 下标或元素标识符是字符串,提供一种类型
关联数组功能。 数组名称后跟方括号内的下标
可以用作左值,从而用作表达式,如语法中所述; 看
英语文法。 无下标的数组名称只能在以下上下文中使用:
* 函数定义或函数调用中的参数
*“ 您的姓名 使用任何关键字后的标记 in 按照语法中的规定(参见
英语文法); 如果在此上下文中使用的名称不是数组名称,则行为是
未定义
有效的数组 指数 应由一个或多个组成- 分隔表达式,类似于
某些编程语言中多维数组的索引方式。
计划 AWK 数组实际上是一维的,例如- 单独的列表应为
通过连接单独的字符串值转换为单个字符串
表达式,每个表达式通过值彼此分隔 分会 多变的。 就这样
以下两个索引操作应等效:
VAR[表达式1, 表达式2... 表达式]
VAR[表达式1 分会 表达式2 子集 ... 子集 表达式]
应用程序应确保多维度 指数 与 in 运算符是
带括号的。 这 in 运算符,用于测试特定数组是否存在
元素,不应导致该元素存在。 对不存在数组的任何其他引用
元素将自动创建它。
比较(与 '<', “<=”, “!=”, “==”, '>'和 ">=" 运营商)应作出
如果两个操作数都是数字,则一个是数字,另一个是字符串
值是数字字符串,或者如果一个是数字而另一个具有未初始化的值
价值。 否则,操作数应根据需要转换为字符串,并且字符串
应使用特定于区域设置的排序顺序进行比较。 的价值
如果关系为真,则比较表达式应为 1;如果关系为假,则比较表达式应为 0。
变量 和 Special 变量
变量可以用在 AWK 通过引用它们来编程。 除了
函数参数(参见 用户自定义 功能),它们没有明确声明。
函数参数名称应是函数的局部名称; 所有其他变量名称应为
全球的。 同一名称不能同时用作函数参数名称和名称
一个函数或一个特殊的 AWK 多变的。 同一名称不得同时使用
具有全局作用域的变量名并作为函数的名称。 不得同名
在同一范围内用作标量变量和数组。 未初始化
变量,包括标量变量、数组元素和字段变量,应具有
未初始化的值。 未初始化的值应同时具有数值零和
空字符串的字符串值。 评估具有未初始化值的变量,以
字符串或数字,应由使用它们的上下文确定。
字段变量应由 '$' 后跟数字或数值表达式。
字段数的影响 表达 评估非负数以外的任何值
整数未指定; 未初始化的变量或字符串值不需要转换为
在此上下文中的数值。 可以通过赋值来创建新的字段变量
他们。 对不存在字段的引用(即 $ 之后的字段)NF),应评估为
未初始化的值。 此类引用不得创建新字段。 然而,分配给
不存在的字段(例如,$(NF+2)=5) 应增加 NF; 创建任何
具有未初始化值的中间字段; 并使 $0 的值为
重新计算,字段由值分隔 飞行服务队。 每个字段变量
创建时应具有字符串值或未初始化的值。 字段变量应
使用 $0 创建时具有未初始化的值 FS 并且变量不
包含任何字符。 如果合适,字段变量应被视为数字
字符串(参见 表达式 in AWK).
实现应支持以下设置的其他特殊变量 AWK:
农业研究中心 中的元素数量 无人驾驶汽车 数组。
无人驾驶汽车 命令行参数数组,不包括选项和 程序 论据,
从零到编号 农业研究中心-1。
中的论点 无人驾驶汽车 可以修改或添加; 农业研究中心 可以改变。 正如每个
输入文件结束, AWK 应处理的下一个非空元素 无人驾驶汽车, 至
当前值 农业研究中心-1(含),作为下一个输入文件的名称。 因此,
设置一个元素 无人驾驶汽车 为 null 意味着它不应被视为
输入文件。 名字 '-' 表示标准输入。 如果参数匹配
的格式 分配 操作数,该参数应被视为
分配 而不是 文件 论据。
转换 这个 的printf 将数字转换为字符串的格式(输出除外)
陈述,其中 正交频域调制 用来); “%.6g” 默认情况下。
环保 表示环境值的数组,如中所述 EXEC
POSIX.1-2008 系统接口卷中定义的函数。 指数
数组的应该是由环境名称组成的字符串
变量,每个数组元素的值应为由以下内容组成的字符串
该变量的值。 如果合适,环境变量应为
被认为是 数字 绳子 (见 表达式 in AWK); 数组元素应
也有它的数值。
在所有情况下,如果行为 AWK 受环境变量影响
(包括任何命令的环境 AWK 通过执行 系统
函数或通过管道重定向 打印 声明,该 的printf
声明,或 函数getline 函数),使用的环境应为
当时的环境 AWK 开始执行; 它是实现定义的
是否有任何修改 环保 影响这个环境。
文件名 当前输入文件的路径名。 里面一个 BEGIN 动作的值为
不明确的。 里面一个 END 动作值应为最后输入的名称
文件已处理。
FNR 当前文件中当前记录的序号。 里面一个 BEGIN
动作值应为零。 里面一个 END 动作的值应为
最后处理的文件中最后处理的记录的编号。
FS 输入字段分隔符正则表达式; A 默认情况下。
NF 当前记录中的字段数。 里面一个 BEGIN 行动,使用 NF
是未定义的,除非 函数getline 函数没有 VAR 参数被执行
之前。 里面一个 END 行动, NF 应保留其最后的价值
记录读取,除非后续的重定向, 函数getline 函数没有 VAR
参数在输入之前执行 END 行动。
NR 当前记录从输入开始的序号。 里面一个
BEGIN 动作值应为零。 里面一个 END 动作的值应为
最后处理的记录数。
正交频域调制 这个 的printf 在输出语句中将数字转换为字符串的格式(请参阅
输出 声明); “%.6g” 默认情况下。 转换的结果是
未指定,如果的值 正交频域调制 不是浮点格式规范。
飞行服务队 这个 打印 语句输出字段分隔符; 默认情况下。
ORS 这个 打印 语句输出记录分隔符; A 默认情况下。
长度 匹配的字符串的长度 匹配 功能。
RS 字符串值的第一个字符 RS 应为输入记录
分隔器; A 默认情况下。 如果 RS 包含多个字符,则
结果未指定。 如果 RS 为空,则记录由序列分隔
由一个加一个或多个空行,前导或尾随
空行不应导致开头或结尾出现空记录
输入,和一个应始终是字段分隔符,无论
价值 FS 是。
启动 匹配的字符串的起始位置 匹配 功能、编号
从 1 开始。这应始终等于 匹配
功能。
分会 多维数组的下标分隔符字符串; 默认值
是实现定义的。
原价 表达式
这个 AWK 实用程序应使用扩展的正则表达式符号(请参阅基本
POSIX.1-2008 的定义卷, 部分 9.4, 扩展 原价 表达式) 除了那个
它应允许使用 C 语言约定来转义其中的特殊字符
ERE,如 POSIX.1-2008 基本定义卷中的表中所指定,
章节 5, 文件 格式 符号 ('\\', '\一种', '\b', '\F', '\n', '\r', '\t', '\v')和
下表; 这些转义序列应在内部和外部都被识别
括号表达式。 请注意,记录不需要用分隔符分隔字符和
字符串常量可以包含字符,所以即使 "\n" 序列有效于
AWK ERE。 用一个ERE 中的字符需要进行转义,如
下表。
表 4-2: 逃生 序列 in AWK
┌──────────┬──────────────────────────────────┬── ──────────────────────────────────┐
│ 逃生 │ │ │
│序列 │ 描述 │ 意 │
├──────────┼──────────────────────────────────┼── ──────────────────────────────────┤
│\" │ │ 人物 │
├──────────┼──────────────────────────────────┼── ──────────────────────────────────┤
│\/ │ │ 人物 │
├──────────┼──────────────────────────────────┼── ──────────────────────────────────┤
│\ddd │ A 后面的字符 │ 编码为 的字符 │
│ │ 由一的最长序列, │ 由一、二或 表示 │
│ │ 两位或三位八进制数字 │ 三位八进制整数。 多 │
│ │ 字符 (01234567)。 如果所有 │ 字节字符都需要多个, │
│ │ 数字为 0(即 │ 的串联转义序列 │
│ │ NUL 的表示 │ 这种类型,包括前导 │
│ │ 性格),行为是 │ 对于每个字节。 │
│ │ 未定义。 │ │
├──────────┼──────────────────────────────────┼── ──────────────────────────────────┤
│\c │ A 后面跟着的字符 │ 未定义 │
│ │ 由 中未描述的任何字符 │ │
│ │ 此表或表中 │ │
│ │ 基本定义卷 │ │
│ │ POSIX.1-2008, 章节 5, 文件 │ │
│ │ 格式 符号 ('\\', '\一种', '\b', │ │
│ │ '\F', '\n', '\r', '\t', '\v')。 │ │
└──────────┴──────────────────────────────────┴── ──────────────────────────────────┘
正则表达式可以使用以下之一与特定字段或字符串进行匹配
两个正则表达式匹配运算符, '~' 和 “!~”。 这些运营商应解释
它们的右侧操作数作为正则表达式,左侧操作数作为字符串。
如果正则表达式与字符串匹配,则 '~' 表达式应计算出一个值
1和 “!~” 表达式的计算结果应为 0。(正则表达式
匹配操作由基本定义卷中的术语“匹配”定义
POSIX.1-2008, 部分 9.1, 原价 口语 定义,其中任何一个都发生匹配
字符串的一部分,除非正则表达式受到限制或者
特殊字符。)如果正则表达式与字符串不匹配,
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 '~' 表达式的计算结果应为 0,并且 “!~” 表达式应求值
值为 1。如果右侧操作数是除词法标记之外的任何表达式
ERE,表达式的字符串值应被解释为扩展正则
表达式,包括上述转义约定。 请注意,这些相同的转义
约定还应应用于确定字符串文字的值(
词汇标记 STRING),因此当字符串文字为
在这种情况下使用。
当 ERE 标记在任何上下文中都显示为表达式,但作为右侧的表达式除外
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 '~' or “!~” 运算符或作为下面描述的内置函数参数之一,
结果表达式的值应等于:
$0 " " /ERE/
这个 ERE 论证 格子, 匹配, 分 函数,以及 fs 论证 分裂
功能(见 串 功能) 应被解释为扩展正则表达式。
这些可以是 ERE 标记或任意表达式,并应在
与右侧相同的方式 '~' or “!~” 运营商。
扩展正则表达式可用于通过分配字符串来分隔字段
包含内置变量的表达式 FS,直接或作为结果
使用 -F 七弦琴 选项。 默认值 FS 变量应为单个
。 下面介绍一下 FS 行为:
1。 如果 FS 是空字符串,行为未指定。
2。 如果 FS 是单个字符:
一种。 如果 FS 是, 跳过前导和尾随和人物;
字段应由一组或多组分隔或者人物。
b. 否则,如果 FS 是任何其他字符 c,字段应由每个分隔
单次出现 c.
3. 否则,字符串值 FS 应被视为延长的常规
表达。 与扩展正则表达式匹配的序列的每次出现
应界定字段。
除了 '~' 和 “!~” 运营商,并且在 格子, 匹配, 分裂和 分 内建的
函数,ERE 匹配应基于输入记录; 即记录分隔符
字符(变量值的第一个字符 RS, 默认情况下)
不能嵌入表达式中,并且任何表达式都不能与记录分隔符匹配
特点。 如果记录分隔符不是, 嵌入的字符
表达式可以匹配。 为了 '~' 和 “!~” 运算符,并在这四个内置
函数,ERE匹配应基于文本字符串; 即任何字符(包括
和记录分隔符)可以嵌入到模式中,并且适当的
模式应匹配任何字符。 然而,在所有 AWK ERE 匹配,使用一个或
模式、输入记录或文本字符串中的更多 NUL 字符会产生未定义
结果。
模式
A 模式 是否有效 表达,由两个用 a 分隔的表达式指定的范围
逗号,或两个特殊模式之一 BEGIN or END.
Special 模式
这个 AWK 实用程序应识别两种特殊模式, BEGIN 和 END。 每 BEGIN 模式
应匹配一次,并在输入的第一条记录之前执行其关联的操作
被读取——除非可能通过使用 函数getline 功能(见 输入输出 和 一般用途总体评估
功能)在先前的 BEGIN 操作——在命令行分配完成之前。 每个 END
模式应匹配一次,并且其关联的操作在最后一条记录之后执行
输入已被读取。 这两个模式应具有关联的操作。
BEGIN 和 END 不得与其他图案组合。 多种的 BEGIN 和 END 图案应
被)允许。 与以下内容相关的行动 BEGIN 模式应按顺序执行
程序中指定的,也是 END 行动。 一个 END 模式可以先于 BEGIN
程序中的模式。
如果 AWK 程序仅包含具有模式的操作 BEGIN,并 BEGIN 行动
不含 函数getline 功能, AWK 当最后一次时应退出而不读取其输入
最后的声明 BEGIN 动作被执行。 如果 AWK 程序仅由动作组成
与模式 END 或仅执行具有模式的操作 BEGIN 和 END,输入应为
在声明之前阅读 END 动作被执行。
口语 模式
表达式模式应被评估为布尔上下文中的表达式。
如果结果为真,则模式应被视为匹配,并且关联的操作
(如有)应予执行。 如果结果为假,则不会执行该操作。
模式 射击场
模式范围由两个用逗号分隔的表达式组成; 在这种情况下,动作
应对第一个表达式与第一个表达式的匹配之间的所有记录执行
接下来是第二个表达式的匹配(包括在内)。 此时,图案范围可
从匹配范围末尾之后的输入记录开始重复。
行动
动作是一系列语句,如语法中所示 英语文法。 任意单
语句可以替换为括在花括号中的语句列表。 应用程序
应确保语句列表中的语句由或者
人物。 语句列表中的语句按照顺序依次执行
他们出现。
这个 表达 充当条件 if 声明应被评估,如果它
非零或非空,则执行以下语句; 否则,如果 其他 is
目前,以下声明 其他 应予执行。
这个 if, 而, do...而, HPMC胶囊, 打破和 继续 声明基于 ISO C
标准(参见 部分 1.1.2, 概念 派生 , 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 ISO C 标准版),除了
布尔表达式应按中所述进行处理 表达式 in AWK,并且除了在
案例:
HPMC胶囊 (变量 in 排列)
它将迭代,分配每个 指数 of 排列 至 变量 以未指定的顺序。
添加新元素的结果 排列 在这样一个 HPMC胶囊 循环未定义。 如果一个
打破 or 继续 语句发生在循环之外,行为未定义。
这个 删除 语句应删除单个数组元素。 因此,下面的代码
删除整个数组:
HPMC胶囊 (指数 in 大批)
删除 数组[索引]
这个 下页 语句应导致当前输入记录的所有进一步处理
弃。 该行为是未定义的,如果 下页 语句出现或被调用 BEGIN
or END 行动。
这个 出口 声明应调用所有 END 动作按照它们发生的顺序
程序源,然后终止程序而不读取进一步的输入。 一个 出口
里面的声明 END 操作应终止程序而不进一步执行
END 行动。 如果在 a 中指定了一个表达式 出口 语句,其数值应
是退出状态 AWK,除非遇到后续错误或后续 出口
执行带有表达式的语句。
输出 声明
以上皆是 打印 和 的printf 默认情况下,语句应写入标准输出。 输出
应写入指定的位置 输出重定向 如果提供一个,如
如下:
> 表达
>> 表达
| 表达
在所有情况下, 表达 应评估以产生用作
要写入的路径名(对于 '>' or “>>”)或作为要执行的命令(对于 '|').
使用前两种形式,如果该名称的文件当前未打开,则应为
打开,如有必要创建它并使用第一种形式,截断文件。 输出
然后应附加到文件中。 只要文件保持打开状态,后续调用
这 表达 评估为相同的字符串值应简单地将输出附加到
文件。 文件保持打开状态,直到 关闭 功能(见 输入输出 和 一般用途总体评估
功能) 使用计算结果为相同字符串值的表达式进行调用。
第三种形式应将输出写入通过管道传输到命令输入的流上。 这
如果当前没有打开流,则应创建流,其值为 表达 其
命令名称。 创建的流应与调用创建的流等效
en() 函数在 POSIX.1‐2008 的系统接口卷中定义,其值为
表达 作为 命令 参数和值 w 作为 模式 争论。 只要
流保持打开状态,后续调用中 表达 计算结果为相同的字符串
value 应将输出写入现有流。 该流应保持开放状态,直到
关闭 功能(见 输入输出 和 一般用途总体评估 功能) 被调用的表达式为
计算结果为相同的字符串值。 那时,流将被关闭,就像被一个
打电话给 关闭() 函数在 POSIX.1-2008 的系统接口卷中定义。
正如语法中详细描述的 英语文法,这些输出语句应采用
- 单独的列表 表达s 在语法中被非终结符引用
符号 表达式列表, 打印表达式列表或 print_expr_list_opt。 此列表参考此处
作为 表达 名单,每个成员被称为 表达 论点.
这个 打印 语句应将每个表达式参数的值写入指定的
输出流由当前输出字段分隔符分隔(参见变量 飞行服务队 多于),
并由输出记录分隔符终止(参见变量 ORS 多于)。 所有表情
参数应被视为字符串,必要时进行转换; 这种转换应
如中所述 表达式 in AWK,除了 的printf 格式化为 正交频域调制
应使用而不是值 转换。 空表达式列表应代表
整个输入记录($0)。
这个 的printf 语句应基于类似于文件格式的符号生成输出
本卷 POSIX.1‐2008 中用于描述文件格式的符号(请参阅 Base
POSIX.1-2008 的定义卷, 章节 5, 文件 格式 符号)。 输出应为
按照第一个指定的方式生产 表达 作为字符串的参数 格式 和
随后 表达 作为字符串的参数 参数1 至 精氨酸,包含以下内容
例外情况:
1. 格式 应是实际的字符串而不是图形表示。
因此,它不能包含空字符位置。 这在里面 格式
字符串,在除 a 之外的任何上下文中 旗 的转换规范,应为
被视为复制到输出的普通字符。
2. 如果字符集包含 '' 字符并且该字符出现在 格式
string,它应被视为复制到输出的普通字符。
3. 逃生 序列 开始于字符应被视为
复制到输出的普通字符序列。 请注意,这些相同
序列应按词法解释 AWK 当它们出现在文字字符串中时,
但不得给予特殊待遇 的printf 语句。
4。 “ 部分 宽度 or 精确 可以指定为 '*' 字符而不是数字
细绳。 在这种情况下,应从表达式列表中获取下一个参数并
其数值作为字段宽度或精度。
5. 执行不得先于或跟随于输出 d or u 转变
说明符字符未指定的字符 格式 字符串。
6. 实施不得先于输出 o 转换说明符
带有未指定的前导零 格式 字符串。
7。 为了 c 转换说明符:如果参数具有数值,则
应输出编码为该值的字符。 如果该值为零或不为零
字符集中任何字符的编码,行为未定义。 如果
参数没有数值,字符串值的第一个字符应
被输出; 如果字符串不包含任何字符,则行为未定义。
8. 对于每个使用参数的转换规范,下一个表达式
应评估论证。 除了 c 转换说明符
字符,值将被转换(根据指定的规则
表达式 in AWK) 到转换规范的适当类型。
9. 如果表达式参数不足以满足所有转换
规格中的 格式 字符串,行为未定义。
10. 如果有任何字符序列 格式 字符串以 a 开头 '%' 性格,但确实
没有形成有效的转换规范,行为是未指定的。
以上皆是 打印 和 的printf 至少可以输出 {LINE_MAX} 个字节。
功能
这个 AWK 语言有多种内置函数:算术、字符串、输入/输出、
和一般。
算术 功能
算术函数,除了 INT,应基于 ISO C 标准(参见
部分 1.1.2, 概念 派生 , 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 ISO C 标准版)。 该行为未定义于
ISO C 标准指定返回错误或行为是的情况
不明确的。 虽然语法(参见 英语文法) 允许内置函数出现而无需
参数或括号,除非参数或括号在中指示为可选
以下列表(通过将它们显示在 “[]” 括号),这种用法是未定义的。
阿坦2(y,x)
返回 的反正切值 y/x 以弧度表示,范围为 [−π,π]。
车(x) 返回余弦 x,在 Moku:Pro 上 x 以弧度为单位。
无(x) 返回正弦值 x,在 Moku:Pro 上 x 以弧度为单位。
EXP(x) 返回指数函数 x.
日志(x) 返回的自然对数 x.
开方(x) 返回的平方根 x.
INT(x) 返回截断为整数的参数。 当以下情况时,截断应接近 0:
x> 0。
兰特() 返回一个随机数 n,使得 0≤n
rand([表达式])
设置种子值 兰特 至 表达式 或使用一天中的时间,如果 表达式 被省略。
应返回先前的种子值。
串 功能
应支持以下列表中的字符串函数。 虽然语法(参见
英语文法) 允许内置函数出现时不带参数或括号,除非
参数或括号在以下列表中指示为可选(通过显示
他们在 “[]” 括号),这种用法是未定义的。
格子(ERE, 代表[, in])
表现得像 分 (见下文),但它应替换所有出现的
正则表达式(如 ed 实用程序全局替代品)在 $0 或 in
参数,当指定时。
指数(s, t)
返回字符串中的位置,以字符为单位,从 1 开始编号 s 其中字符串 t
首先发生,如果根本不发生则为零。
长度[([s])]
返回作为字符串的参数的长度(以字符为单位),或者
整个记录,$0,如果没有参数。
匹配(s, ERE)
返回字符串中的位置,以字符为单位,从 1 开始编号 s 其中
扩展正则表达式 ERE 发生,如果根本不发生则为零。
RSTART 应设置为起始位置(与返回的相同)
值),如果没有找到匹配则为零; RLENGTH 应设置为长度
匹配的字符串,如果未找到匹配项,则为 -1。
分裂(s, a[, fs ])
拆分字符串 s 成数组元素 a[1] a[2],..., a[n],然后返回 n。 所有
在执行分割之前,应删除数组的元素。 这
应使用 ERE 进行分离 fs 或使用字段分隔符 FS if fs is
没有给。 每个数组元素在创建时应有一个字符串值,如果
适当的,数组元素应被视为数字字符串(参见
表达式 in AWK)。 空字符串作为值的效果 fs is
未指定。
冲刺(fmt, 表达式, 表达式,...)
根据以下内容格式化表达式 的printf 格式由 fmt 然后返回
结果字符串。
子(ERE, 代表[, in ])
替换字符串 代表 代替扩展的第一个实例
正则表达式 ERE 在字符串中 in 并返回替换数。 一个
('&') 出现在字符串中 代表 应替换为字符串
, in 与 ERE 匹配。 一个前面有一个将
被解释为字面意思特点。 出现两个
连续的字符应被解释为单个文字
特点。 任何其他情况的发生(例如,
在任何其他字符之前)应被视为文字
特点。 请注意,如果 代表 是一个字符串文字(词汇标记 STRING; 看到
英语文法),处理字符出现在任何词汇之后
处理,包括任何词汇-转义序列处理。 如果 in
已指定且它不是左值(请参阅 表达式 in AWK),行为是
不明确的。 如果 in 省略, AWK 应使用当前记录 ($0) 代替它。
子字符串(s, m[, n ])
最多返回 n-字符的子串 s 从位置开始 m,
从 1 开始编号。如果 n 被省略,或者如果 n 指定的字符数多于实际字符数
留在字符串中,子串的长度应受长度限制
弦的 s.
降低(s)
根据字符串返回一个字符串 s。 中的每个角色 s 这是一个大写字母
指定有一个字母 降低 映射由 LC_CTYPE 的类别
当前区域设置应在返回的字符串中替换为小写字母
由映射指定。 中的其他角色 s 中应保持不变
返回的字符串。
上衣(s)
根据字符串返回一个字符串 s。 中的每个角色 s 这是一个小写字母
指定有一个字母 上衣 映射由 LC_CTYPE 的类别
当前区域设置在返回的字符串中替换为大写字母
由映射指定。 中的其他角色 s 返回的内容没有变化
字符串。
所有前面的函数都需要 ERE 作为参数,需要一个模式或字符串
值表达式是定义在的正则表达式 原价 表达式.
输入输出 和 一般用途总体评估 功能
输入/输出和一般功能是:
关闭(表达)
关闭由 a 打开的文件或管道 打印 or 的printf 声明或致电
函数getline 具有相同的字符串值 表达。 开放数量限制
表达 参数是实现定义的。 如果关闭成功,则
函数应返回零; 否则,它将返回非零。
表达 | 函数getline [VAR]
从命令输出通过管道传输的流中读取输入记录。 这
如果当前没有打开流,则应创建流,其值为
表达 作为其命令名称。 创建的流应相当于一个
通过调用创建 en() 函数的值为 表达 作为
命令 参数和值 r 作为 模式 争论。 只要溪流
保持开放状态,后续通话中 表达 计算结果为相同的字符串
value 应从流中读取后续记录。 流应保留
打开直到 关闭 使用计算结果为的表达式调用函数
相同的字符串值。 那时,流将被关闭,就像调用
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 关闭() 功能。 如果 VAR 被省略,$0 和 NF 应设置; 否则, VAR
应设置,如果适用,应将其视为数字字符串(请参阅
表达式 in AWK).
这个 函数getline 当存在时,运算符可以形成不明确的结构
左侧不带括号的运算符(包括连接) '|' (到
表达式的开头包含 函数getline)。 在这样的背景下 '$'
操作员, '|' 应表现得好像它的优先级低于 '$'. 结果
评估其他运营商的方式未指定,符合要求的应用程序应
正确地将所有此类用法括起来。
函数getline 将 $0 设置为当前输入文件中的下一个输入记录。 这种形式的
函数getline 应设置 NF, NR和 FNR 变量。
函数getline VAR
设置变量 VAR 到当前输入文件的下一个输入记录,如果
合适的, VAR 应被视为数字字符串(参见 表达式 in AWK).
这种形式 函数getline 应设置 FNR 和 NR 变量。
函数getline [VAR] < 表达
从命名文件中读取下一条输入记录。 这 表达 应该
评估以生成用作路径名的字符串。 如果那个文件
名称当前未打开,应打开。 只要溪流还在
打开,后续调用其中 表达 计算结果为相同的字符串值
应从文件中读取后续记录。 文件应保持打开状态,直到
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 关闭 使用计算结果相同的表达式调用函数
字符串值。 如果 VAR 被省略,$0 和 NF 应设置; 否则, VAR 应该
设置,如果合适,它应被视为数字字符串(参见
表达式 in AWK).
这个 函数getline 当存在时,运算符可以形成不明确的结构
右侧不带括号的二元运算符(包括连接) '<'
(直到包含 函数getline)。 的结果
评估这样的构造是未指定的,并且符合要求的应用程序应
正确地将所有此类用法括起来。
系统(表达)
执行由给出的命令 表达 以相当于 系统()
POSIX.1‐2008 系统接口卷中定义的函数并返回
命令的退出状态。
所有形式 函数getline 成功输入时返回 1,文件结束时返回 1,返回 -XNUMX
一个错误。
当字符串用作文件或管道的名称时,应用程序应确保
字符串在文本上是相同的。 术语“相同的字符串值”意味着
“等效字符串”,即使是那些仅不同的字符串字符,代表
不同的文件。
用户自定义 功能
这个 AWK 语言还提供用户定义的函数。 这些函数可以定义为:
function 姓名([参数...]){ 声明 }
函数可以在任何地方被引用 AWK 程序; 特别是,它的使用可以
位于其定义之前。 函数的作用域是全局的。
函数参数(如果存在)可以是标量或数组; 的行为是
如果将数组名称作为参数传递给函数用作标量,则为未定义,或者
如果标量表达式作为参数传递,函数将其用作数组。
如果是标量,则函数参数应按值传递;如果是数组名称,则应按引用传递。
函数定义中参数的数量不需要与
函数调用中的参数。 多余的形式参数可以用作局部变量。
如果函数调用中提供的参数少于函数定义中提供的参数,
在函数体中用作标量的额外参数应计算为
未初始化的值,直到它们以其他方式初始化,以及额外的参数
在函数体中使用的数组应被视为未初始化的数组,其中
每个元素的计算结果都是未初始化的值,直到进行其他初始化。
调用函数时,函数名和函数名之间不能有空格
左括号。 函数调用可以嵌套,也可以进行递归调用
功能。 从任何嵌套或递归函数调用返回后,所有的值
除了传递的数组参数外,调用函数的参数应保持不变
引用。 这 回报 语句可用于返回一个值。 如果一个 回报 声明
出现在函数定义之外,行为未定义。
在函数定义中, 开头前的字符是可选的
大括号和右大括号之后。 函数定义可以出现在程序的任何地方
其中一 模式-动作 允许配对。
英语文法
本节中的语法和下一节中的词汇约定应
一起描述语法 AWK 程式。 这种风格的一般约定
语法在 部分 1.3, 英语文法 公约. 一个有效的程序可以是
表示为非终结符 程序 在语法中。 这种正式的语法应
优先于前面的文本语法描述。
%令牌 您的姓名 NUMBER STRING ERE
%令牌 FUNC_NAME /* 姓名 其次 by '(' 也完全不需要 白色 空间。 */
/* 关键字 */
%token 开始 结束
/* '开始' '结束' */
%token 中断 继续 删除 执行其他操作
/* '中断' '继续' '删除' '执行' '其他' */
%token 退出函数 If In
/* '退出' 'for' '函数' 'if' 'in' */
%token Next 打印 Printf 返回 While
/* '下一个' '打印' 'printf' '返回' 'while' */
/* 保留函数名 */
%token BUILTIN_FUNC_NAME
/* 一个令牌用于以下内容:
* atan2 cos sin exp log sqrt int rand srand
* gsub索引长度匹配split sprintf sub
* 下至上关闭系统
*/
%token GETLINE
/* 语法上与其他内置函数不同。 */
/* 两个字符的标记。 */
%token ADD_ASSIGN SUB_ASSIGN MUL_ASSIGN DIV_ASSIGN MOD_ASSIGN POW_ASSIGN
/* '+=' '−=' '*=' '/=' '%=' '^=' */
%token OR AND NO_MATCH EQ LE GE NE INCR DECR APPEND
/* '||' '&&' '!~' '==' '<=' '>=' '!=' '++' '−−' '>>' */
/* 单字符标记。 */
%token '{' '}' '(' ')' '[' ']' ',' ';' 新队
%token '+' '−' '*' '%' '^' '!' '>' '<' '|' '?' ':' ' " " ' '$' '='
%启动程序
%%
程序:项目列表
| 无动作_项目_列表
;
item_list : newline_opt
| actionless_item_list 项目终止符
| item_list 项目终止符
| item_list 动作终止符
;
actionless_item_list : item_list 模式终止符
| actionless_item_list 模式终止符
;
项目 : 图案动作
| 函数名称'('param_list_opt')'
newline_opt 操作
| 函数 FUNC_NAME '('param_list_opt')'
newline_opt 操作
;
param_list_opt : /* 空 */
| 参数列表
;
参数列表:名称
| param_list ',' 名称
;
模式:开始
| 结尾
| 表达式
| expr ',' newline_opt expr
;
操作:'{'newline_opt'}'
| '{' newline_opt Termination_statement_list '}'
| '{' newline_opt untermerated_statement_list '}'
;
终止符:终止符';'
| 终结符换行符
| ';'
| 新队
;
终止语句列表:终止语句
| 终止语句列表 终止语句
;
未终止语句列表:未终止语句
| 终止语句列表 未终止语句
;
Termination_statement : 动作 newline_opt
| if '('expr')' newline_opt终止语句
| if '('expr')' newline_opt终止语句
否则 newline_opt 终止_语句
| while '('expr')' newline_opt终止_语句
| 对于 '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
终止语句
| 对于 '('NAME In NAME')' newline_opt
终止语句
| ';' 换行符选项
| terminatorable_statement NEWLINE newline_opt
| terminable_statement ';' 换行符选项
;
未终止的语句:可终止的语句
| if '('expr')' newline_opt untermerated_statement
| if '('expr')' newline_opt终止语句
否则 newline_opt 未终止_语句
| while '('expr')' newline_opt untermerated_statement
| 对于 '(' simple_statement_opt ';'
expr_opt ';' simple_statement_opt ')' newline_opt
未终止的语句
| 对于 '('NAME In NAME')' newline_opt
未终止的语句
;
可终止语句:简单语句
| 休息
| 继续
| 下一个
| 退出expr_opt
| 返回expr_opt
| 执行 newline_opt Termination_statement While '(' expr ')'
;
simple_statement_opt : /* 空 */
| 简单语句
;
simple_statement : 删除 NAME '[' expr_list ']'
| 表达式
| 打印语句
;
打印语句:简单打印语句
| simple_print_statement 输出重定向
;
simple_print_statement : 打印 print_expr_list_opt
| 打印 '(' multiple_expr_list ')'
| printf 打印表达式列表
| printf '(' multiple_expr_list ')'
;
输出重定向:'>'表达式
| 追加表达式
| '|' 表达式
;
expr_list_opt : /* 空 */
| 表达式列表
;
expr_list : 表达式
| 多重表达式列表
;
multiple_expr_list : expr ',' newline_opt expr
| multiple_expr_list ',' newline_opt expr
;
expr_opt : /* 空 */
| 表达式
;
expr : 一元表达式
| 非一元表达式
;
unary_expr : '+' 表达式
| '-' 表达式
| unary_expr '^' 表达式
| unary_expr '*' 表达式
| unary_expr '/' 表达式
| unary_expr '%' 表达式
| unary_expr '+' 表达式
| unary_expr '−' 表达式
| 一元表达式 非一元表达式
| unary_expr '<' 表达式
| unary_expr LE 表达式
| unary_expr NE 表达式
| unary_expr EQ 表达式
| unary_expr '>' 表达式
| unary_expr GE 表达式
| unary_expr '~' 表达式
| unary_expr NO_MATCH 表达式
| unary_expr 在 NAME 中
| unary_expr 和 newline_opt expr
| unary_expr 或 newline_opt expr
| 一元表达式 '?' 表达式 ':' 表达式
| 一元输入函数
;
非一元表达式:'('表达式')'
| '!' 表达式
| non_unary_expr '^' 表达式
| non_unary_expr '*' 表达式
| non_unary_expr '/' 表达式
| non_unary_expr '%' 表达式
| non_unary_expr '+' 表达式
| non_unary_expr '−' 表达式
| 非一元表达式 非一元表达式
| non_unary_expr '<' 表达式
| non_unary_expr LE 表达式
| non_unary_expr NE 表达式
| non_unary_expr EQ 表达式
| non_unary_expr '>' 表达式
| non_unary_expr GE 表达式
| non_unary_expr '~' 表达式
| non_unary_expr NO_MATCH 表达式
| NAME 中的 non_unary_expr
| 名称中的“(‘multiple_expr_list’)”
| non_unary_expr 和 newline_opt expr
| non_unary_expr 或 newline_opt expr
| 非一元表达式 '?' 表达式 ':' 表达式
| 数字
| 细绳
| 左值
| 埃雷
| 左值增量
| 左值DECR
| INCR左值
| DECR左值
| 左值 POW_ASSIGN 表达式
| 左值 MOD_ASSIGN 表达式
| 左值 MUL_ASSIGN 表达式
| 左值 DIV_ASSIGN 表达式
| 左值 ADD_ASSIGN 表达式
| 左值 SUB_ASSIGN 表达式
| 左值 '=' 表达式
| FUNC_NAME '('expr_list_opt')'
/* '(' 之前不允许有空格 */
| BUILTIN_FUNC_NAME '('expr_list_opt')'
| BUILTIN_FUNC_NAME
| 非一元输入函数
;
print_expr_list_opt : /* 空 */
| 打印表达式列表
;
print_expr_list : 打印表达式
| print_expr_list ',' newline_opt print_expr
;
print_expr : 一元打印表达式
| 非一元打印表达式
;
unary_print_expr : '+' 打印表达式
| '-' print_expr
| unary_print_expr '^' print_expr
| unary_print_expr '*' print_expr
| unary_print_expr '/' print_expr
| unary_print_expr '%' print_expr
| unary_print_expr '+' print_expr
| unary_print_expr '−' print_expr
| unary_print_expr 非unary_print_expr
| unary_print_expr '~' print_expr
| unary_print_expr NO_MATCH print_expr
| unary_print_expr 在 NAME 中
| unary_print_expr 和 newline_opt print_expr
| unary_print_expr 或 newline_opt print_expr
| unary_print_expr '?' print_expr ':' print_expr
;
non_unary_print_expr : '('expr ')'
| '!' 打印表达式
| non_unary_print_expr '^' print_expr
| non_unary_print_expr '*' print_expr
| non_unary_print_expr '/' print_expr
| non_unary_print_expr '%' print_expr
| non_unary_print_expr '+' print_expr
| non_unary_print_expr '−' print_expr
| non_unary_print_expr non_unary_print_expr
| non_unary_print_expr '~' print_expr
| non_unary_print_expr NO_MATCH print_expr
| NAME 中的 non_unary_print_expr
| 名称中的“(‘multiple_expr_list’)”
| non_unary_print_expr 和 newline_opt print_expr
| non_unary_print_expr 或 newline_opt print_expr
| non_unary_print_expr '?' print_expr ':' print_expr
| 数字
| 细绳
| 左值
| 埃雷
| 左值增量
| 左值DECR
| INCR左值
| DECR左值
| 左值 POW_ASSIGN print_expr
| 左值 MOD_ASSIGN print_expr
| 左值 MUL_ASSIGN print_expr
| 左值 DIV_ASSIGN print_expr
| 左值 ADD_ASSIGN print_expr
| 左值 SUB_ASSIGN print_expr
| 左值 '=' print_expr
| FUNC_NAME '('expr_list_opt')'
/* '(' 之前不允许有空格 */
| BUILTIN_FUNC_NAME '('expr_list_opt')'
| BUILTIN_FUNC_NAME
;
左值:名称
| 名称'['expr_list']'
| '$' 表达式
;
非一元输入函数:simple_get
| simple_get '<' 表达式
| 非一元表达式'|' 简单获取
;
unary_input_function : unary_expr '|' 简单获取
;
simple_get : 获取行
| GETLINE 左值
;
newline_opt : /* 空 */
| newline_opt NEWLINE
;
该语法有几个歧义,应按如下方式解决:
* 运算符优先级和结合性应如中所述 表 4 1, 表达式
in 降低 优先权 in AWK.
* 如有歧义, 其他 应与最近的前一个相关联
if 这将满足语法。
* 在某些情况下, ('/')用于包围 ERE 也可以是
除法运算符。 这应以这样的方式解决:无论在哪里划分
可能会出现运算符, 假设为除法运算符。 (没有
一元除法运算符。)
中的每个表达式 AWK 程序应符合优先级和关联性规则,
即使不需要这样做来解决歧义。 例如,因为 '$' 有更高的
优先于 '++',字符串 “$x++——” 不是有效的 AWK 表达,尽管它是
由语法明确解析为 “$(x++)−−”.
从正式语法中可能不明显的一个约定是
字符是可以接受的。 有几个明显的位置,例如终止
声明,以及可以用来逃跑任意之间的字符
词汇标记。 此外, 字符没有人物可以
后面是逗号、左大括号、逻辑 AND 运算符 (“&&”)、逻辑或运算符 (“||”),
这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 do 关键字, 其他 关键字和右括号 if, HPMC胶囊或 而
陈述。 例如:
{ 打印 $ 1,
$2 }
词法 公约
的词汇约定 AWK 程序,关于前面的语法,应该是
如下:
1. 除非另有说明, AWK 应识别可能的最长标记或分隔符开头
在给定的点。
2. 注释应包含以特点
并由以下情况终止,但不包括下一次出现的情况: 。 评论须
除了分隔词汇标记之外没有任何作用。
3. 该应被识别为令牌 新线.
4.A 字符后紧跟一个不会有任何影响。
5. 代币 STRING 应表示一个字符串常量。 字符串常量应以
人物 '"'。 在字符串常量中, 性格应是
被视为开始转义序列,如 Base 中的表中指定
POSIX.1-2008 的定义卷, 章节 5, 文件 格式 符号 ('\\', '\一种', '\b',
'\F', '\n', '\r', '\t', '\v')。 此外,转义序列 表 4 2, 逃生
序列 in AWK 应被认可。 A 不得出现在字符串内
持续的。 字符串常量应以第一个未转义的出现终止
人物 '"' 在字符串常量的开头之后。 的价值
字符串应是所有未转义字符和转义值的序列
介于两个分隔符之间但不包括两个分隔符的序列 '"' 字符。
6. 代币 ERE 表示扩展的正则表达式常量。 ERE 常数
应开始于特点。 在 ERE 常数内,
字符应被视为开始转义序列,如表中指定
POSIX.1-2008 的基本定义卷, 章节 5, 文件 格式 符号。在
另外,转义序列 表 4 2, 逃生 序列 in AWK 应该
认可。 申请应确保不会发生在 ERE 内
持续的。 ERE 常量应由第一个未转义的出现终止
ERE 常量开头字符之后的字符。 扩展的常规
ERE常量表示的表达式应该是所有未转义的序列
两者之间(但不包括)的转义序列的字符和值
界定人物。
7.A 除了分隔词汇标记或在范围内之外,没有任何作用 STRING or
ERE 令牌。
8. 代币 NUMBER 应表示一个数字常量。 其形式和数值应
要么相当于 小数浮动常量 ISO C 指定的令牌
标准,或者它应该是十进制数字序列,并且应该被评估为
十进制整数常量。 此外,实现可以接受数字常量
其形式和数值相当于 十六进制常数 和
十六进制浮点常数 ISO C 标准指定的标记。
如果该值太大或太小而无法表示(请参阅 部分 1.1.2,
概念 派生 , 这些因素包括原料奶的可用性以及达到必要粉末质量水平所需的工艺。 ISO C 标准版),行为未定义。
9. 可移植字符集中的一系列下划线、数字和字母
(参见 POSIX.1-2008 的基本定义卷, 部分 6.1, 便携版 字符
选择),从一个开始或字母字符,应被视为
字。
10. 以下单词为关键字,应被识别为单独的标记; 这
令牌的名称与关键字相同:
BEGIN 删除 END function in 的printf
打破 do 出口 函数getline 下页 回报
继续 其他 HPMC胶囊 if 打印 而
11. 以下单词是内置函数的名称,应被视为
象征 BUILTIN_FUNC_NAME:
阿坦2 格子 日志 分裂 分 上衣
关闭 指数 匹配 冲刺 子字符串
车 INT 兰特 开方 系统
EXP 长度 无 rand 降低
上面列出的关键字和内置函数的名称被认为是保留的
话。
12. 代币 您的姓名 应包含不是关键字或内置名称的单词
函数并且后面不立即(没有任何分隔符) '('
字符。
13. 代币 FUNC_NAME 应由不是关键字或名称的单词组成
内置函数,紧随其后(没有任何分隔符) '(' 字符。
这个 '(' 字符不得包含在令牌中。
14. 以下两个字符序列应被识别为命名标记:
┌────────────┬──────────┬────────────┬──────────┐
│Token 姓名 │ 序列 │ Token 姓名 │ 序列 │
├────────────┼──────────┼────────────┼──────────┤
│添加_分配 │ += │ 不匹配 │ !~ │
│SUB_ASSIGN │ -= │ EQ │ == │
│MUL_ASSIGN │ *= │ LE │ <= │
│DIV_ASSIGN │ /= │ GE │ >= │
│MOD_分配 │ %= │ NE │ != │
│POW_ASSIGN │ ^= │ 增量 │ ++ │
│OR │ || │ DECR │ --- │
│AND │ && │ 附加 │ >> │
└────────────┴──────────┴────────────┴──────────┘
15. 以下单个字符应被识别为名称为
字符:
{ } ( ) [ ] , ; + - * % ^ ! > < | ? : " " $ =
标记之间存在词汇歧义 ERE 和代币 '/' 和 DIV_ASSIGN.
当输入序列以任何语法上下文中的字符
象征 '/' or DIV_ASSIGN 可以作为有效程序中的下一个标记出现,其中较长的一个
可以识别的这两个令牌应该被识别。 在任何其他语法中
令牌所在的上下文 ERE 可以作为有效程序中的下一个令牌出现,该令牌
ERE 应得到承认。
退出 状态
应返回以下退出值:
0 所有输入文件均已成功处理。
>0 发生错误。
可以通过使用以下命令在程序内更改退出状态 出口 表达。
后果 OF 错误
如果有的话 文件 操作数已指定且无法访问命名文件, AWK 应该写一个
诊断消息发送到标准错误并终止而无需任何进一步操作。
如果程序指定为 程序 操作数或 配置文件 操作数不是
有效 AWK 程序(如扩展描述部分中指定),行为是
不明确的。
这个 以下 部分 旨在 内容丰富。
申请须知 用法
这个 指数, 长度, 匹配和 子字符串 函数不应与类似的函数混淆
ISO C 标准中的功能; 这 AWK 版本处理字符,而 ISO C
标准处理字节。
因为串联操作是用相邻的表达式而不是一个
显式运算符,通常需要使用括号来强制执行正确的操作
评价优先。
示例
这个 AWK 在命令行中指定的程序最容易在单指令中指定
引号(例如,'程序') 对于使用的应用程序 sh因为 AWK 常见的程序
包含 shell 特有的字符,包括双引号。 在案例中
其中一个 AWK 程序包含单引号字符,通常最容易指定
程序的大部分内容都是单引号内的字符串,由 shell 用引号连接起来
单引号字符。 例如:
AWK '/'\''/ { 打印 “引用:”, $0 }'
打印标准输入中包含单引号字符(带前缀)的所有行
- 报价:.
以下是简单的例子 AWK 程式:
1. 将字段 3 大于 5 的所有输入行写入标准输出:
$3 > 5
2. 每十行写一次:
(NR % 10) == 0
3. 写入与正则表达式匹配的子字符串的任意行:
/(G|D)(2[0−9][[:alpha:]]*)/
4. 打印任何包含子字符串的行 'G' or 'D',随后是一系列
数字和字符。 此示例使用字符类 数字 和 阿尔法 匹配
与语言无关的数字和字母字符分别:
/(G|D)([[:数字:][:字母:]]*)/
5. 写入第二个字段与正则表达式匹配且第四个字段匹配的任意行
字段不:
$2 " " /xyz/ && $4 ! " " /xyz/
6. 写入第二个字段包含:
$2 " " /\\/
7. 写入第二个字段包含。 注意
- 转义被解释两次; 一次对字符串进行词法处理
一旦处理正则表达式:
$2 " " “\\\\”
8. 将第二个写入每行的最后一个和最后一个字段。 用 a 分隔字段
:
{OFS=":";打印 $(NF−1), $NF}
9. 写下行号和每行中的字段数。 三个弦
代表行号, ,并且字段的数量被连接
该字符串被写入标准输出:
{打印 NR “” NF}
10. 写入长度超过 72 个字符的行:
长度($0) > 72
11. 以相反的顺序写入前两个字段,并用 飞行服务队:
{ 打印 $ 2, $1 }
12. 相同,输入字段之间用 分隔或者和字符,或
都:
BEGIN { FS = ”,[ \t]*|[ \t]+" }
{ 打印 $ 2, $1 }
13. 将第一列相加,打印总和和平均值:
{s += $1 }
END {打印 “和 is ", s, " 是”, s/NR}
14. 以相反的顺序写入字段,每行一个(每行输入多行输出):
{ HPMC胶囊 (i = NF; i > 0; −−i) 打印 $i }
15. 写入字符串出现之间的所有行 开始 和 停止:
/开始/, /停止/
16. 写入第一个字段与前一个字段不同的所有行:
$1 != 上一页 { 打印; 上一页 = $1 }
17. 模拟 回音:
BEGIN {
HPMC胶囊 (i = 1; i < ARGC; ++i)
printf("%s%s", ARGV[i], i==ARGC−1?"\n":" ")
}
18. 写入包含的路径前缀 PATH 环境变量,每行一个:
BEGIN {
n = 分裂 (环境[“路径”], 路径, “:”)
HPMC胶囊 (i = 1; i <= n; ++i)
打印 路径[i]
}
19.如果有一个名为 输入 包含以下形式的页眉:Page #
和一个名为的文件 程序 其中包含:
/页/ { $2 = n++; }
{ 打印 }
然后命令行:
AWK -f 程序 N = 5 输入
打印文件 输入,填写从 5 开始的页码。
基本原理
此描述基于新 AWK,``nawk'',(参见引用的 这个 AWK
代码编程 语言),它为历史记录引入了许多新功能 AWK:
1、新增关键词: 删除, do, function, 回报
2.新增内置功能: 阿坦2, 关闭, 车, 格子, 匹配, 兰特, 无, rand, 分, 系统
3.新增预定义变量: FNR, 农业研究中心, 无人驾驶汽车, 启动, 长度, 分会
4.新的表达式运算符: ?, :, ,, ^
5. FS 变量和第三个参数 分裂,现在被视为扩展常规
表达式。
6. 运算符优先级已更改,以更紧密地匹配 C 语言。 两个例子
操作不同的代码有:
而 ( n /= 10 > 1) ...
if (!“周” ~ /bwk/) ...
基于较新的实现添加了一些功能 AWK:
* 多个实例 -f 配置文件 被允许。
* 新选项 -v 分配。
* 新的预定义变量 环保.
* 新的内置功能 上衣 和 降低.
* 添加更多格式化功能 的printf 以符合 ISO C 标准。
整体 AWK 语法始终基于 C 语言,具有一些来自
shell 命令语言和其他来源。 正因为如此,它并不完全
与任何其他语言兼容,这给一些用户带来了困惑。 它不是
标准开发者解决此类问题的意图。 一些相对较小的
为了使语言与 ISO C 标准更加兼容而进行了一些更改; 最多
这些更改是基于最近实现中的类似更改,如所述
多于。 还有一些 C 语言约定未包含在其中 AWK。 其中一个
值得注意的是运算符,通常用于指定多个
C语言中的表达式 HPMC胶囊 陈述。 另外,还有很多地方 AWK is
关于可以使用的表达式类型,比 C 语言更具限制性
给定的上下文。 这些限制是由于不同的功能 AWK language
确实提供。
正则表达式在 AWK 从历史实现中已经有所扩展
使它们成为扩展正则表达式的纯超集,如 POSIX.1‐2008 所定义(请参阅
POSIX.1-2008 的基本定义卷, 部分 9.4, 扩展 原价 表达式).
主要扩展是国际化特征和区间表达式。 历史
的实现 AWK 长期以来一直支持- 转义序列作为扩展
扩展的正则表达式,尽管不一致,但此扩展已被保留
与其他公用事业。 两个扩展正则中识别的转义序列的数量
表达式和字符串在实现之间有所不同(通常随着时间的推移而增加)。
POSIX.1‐2008 指定的集合包括已知流行的支持的大多数序列
实施并符合 ISO C 标准。 不支持的一种序列是
十六进制值转义开头 '\X'。 这将允许以更多形式表达的值
内使用的位数少于 9 位 AWK 与 ISO C 标准相同。 然而,因为这个语法
具有不确定的长度,它不允许后续字符是
十六进制数字。 在 C 语言中可以通过使用以下方法来解决此限制
词汇字符串连接。 在里面 AWK 语言,串联也可能是一个解决方案
对于字符串,但不适用于扩展正则表达式(词法 ERE 标记或
动态用作正则表达式的字符串)。 由于此限制,该功能
尚未添加到 POSIX.1-2008。
当在通常使用扩展正则表达式的上下文中使用字符串变量时
出现(在语法中使用词汇标记 ERE 的情况下)该字符串不包含
字面意思人物。
的某些版本 AWK 允许的形式:
FUNC 名称(参数, ... ) { 声明 }
这已被该语言的作者否决,他们要求不要这样做
指定的。
的历史实现 AWK 产生一个错误,如果 下页 语句在a中执行
BEGIN 行动和原因 AWK 终止,如果 下页 语句执行在 END 行动。
这种行为尚未被记录,并且人们认为没有必要
将其标准化。
字符串和数值之间的转换规范更加详细
比历史实现的文档或引用的文档中的要多 这个 AWK
代码编程 语言。 尽管大多数行为被设计为直观的,
细节对于确保不同实现的行为兼容是必要的。 这
在关系表达式中尤其重要,因为操作数的类型
确定是否执行字符串比较或数字比较。 从一个
对于应用程序开发人员来说,通常期望直观的行为并强制执行就足够了
当表达式的类型发生转换(通过添加零或连接空字符串)
显然不符合需要的内容。 目的是明确历史
几乎在所有情况下都要练习。 唯一的例外是,在历史实现中,
变量和常量在其原始值之后保留字符串和数值
可以通过任何使用进行转换。 这意味着引用变量或常量可以有
意想不到的副作用。 例如,历史实现如下
程序:
{
a = “+ 2”
b = 2
if (NR % 2)
c = a + b
if (a == b)
打印 “数字 比较”
其他
打印 “细绳 比较”
}
将为每个奇数执行数字比较(并输出数字比较)
行,但对每个偶数执行字符串比较(和输出字符串比较)
编号线。 POSIX.1‐2008 确保如有必要,比较将是数字。 和
历史实现,以下程序:
BEGIN {
正交频域调制 = “%e”
打印 3.14
正交频域调制 = “%F”
打印 3.14
}
会输出 “3.140000e+00” 两次,因为在第二次 打印 声明常数
“3.14” 将具有来自先前转换的字符串值。 POSIX.1‐2008 要求
第二个的输出 打印 声明是 “3.140000”。 历史行为
实施被认为过于不直观且不可预测。
有人指出,根据早期草案中包含的规则,以下脚本
不会打印任何内容:
BEGIN {
y[1.5] = 1
正交频域调制 = “%e”
打印 y[1.5]
}
因此,一个新变量, 转换,被介绍。 这 正交频域调制 变量现在限制为
影响数字到字符串的输出转换 转换 用于内部
转换,例如比较或数组索引。 默认值与此相同
HPMC胶囊 正交频域调制,所以除非程序改变 转换 (任何历史程序都不会这样做),它
将接收与内部字符串转换相关的历史行为。
POSIX AWK 词汇和句法约定比其他规范更正式地指定
来源。 同样,其目的是明确历史实践。 一项公约可能
从正式语法来看,不像其他口头描述那样明显
字符是可以接受的。 有几个明显的位置,例如终止
声明,以及可以用来逃跑任意之间的字符
词汇标记。 此外, 字符没有人物可以
后面跟随一个逗号、一个左大括号、一个逻辑 AND 运算符 (“&&”),逻辑或运算符
(“||”),则 do 关键字, 其他 关键字和右括号 if, HPMC胶囊或
而 陈述。 例如:
{ 打印 $ 1,
$2 }
的要求 AWK 添加尾随程序参数文本是
简化语法,使其在形式上与文本文件匹配。 没有办法
应用程序或测试套件来确定文字是否是否添加或是否 AWK
只是表现得好像确实如此。
POSIX.1-2008 需要对历史实现进行一些更改才能支持
国际化。 其中最微妙的可能是小数点的使用
字符,定义为 LC_NUMERIC 区域设置的类别,以表示形式
浮点数字。 该区域特定字符用于识别数字
输入、字符串和数值之间的转换以及格式化输出。
然而,无论区域设置如何, 字符(小数点字符
POSIX locale) 是处理中识别的小数点字符 AWK 程式
(包括命令行参数中的赋值)。 这本质上是相同的约定
正如 ISO C 标准中使用的那样。 不同之处在于C语言包括
设置区域() 函数,它允许应用程序修改其区域设置。 因为这
功能,C 应用程序开始执行时,其语言环境设置为 C 语言环境,并且仅
在显式调用后在环境指定的语言环境中执行 设置区域()。
然而,添加如此复杂的新功能 AWK 语言被视为
不适合 POSIX.1-2008。 可以执行 AWK 明确地在任何
通过在 shell 中设置环境来获取所需的语言环境。
扩展正则表达式中的 NUL 导致的未定义行为允许将来
GNU 的扩展 呆子 处理二进制数据的程序。
无效情况下的行为 AWK 程序(包括词汇、句法和
语义错误)未定义,因为它被认为对实现过度限制
来指定。 在大多数情况下,此类错误预计会产生诊断结果和非
零退出状态。 然而,一些实现可能会选择以某种方式扩展语言
使用某些无效的结构。 其他无效构造可能被视为
值得警告,但会导致一些合理的行为。 还有其他构造
在某些实现中可能很难检测到。 另外,不同的实现
可能会在程序的初始解析期间(在读取任何内容之前)检测到给定的错误
输入文件),而其他人可能会在读取一些内容后执行程序时检测到它
输入。 实施者应该意识到尽早诊断错误并
生成有用的诊断可以简化应用程序的调试,从而使
实施更可用。
使用多字符的未指定行为 RS 价值观是允许可能的未来
基于用于记录分隔符的扩展正则表达式的扩展。 历史
实现采用字符串的第一个字符并忽略其他字符。
未指定的行为 分裂(绳子,排列, )用于允许提议的未来
扩展,它将把字符串分割成单个字符的数组。
在上下文中 函数getline 函数,不同优先级的同样好的参数
的 | 和 < 运营商可以制作。 历史实践是这样的:
函数getline < “一种” “乙”
被解析为:
( 函数getline < “一种” ) “乙”
尽管许多人认为其意图是该文件 ab 应该阅读。 然而:
函数getline < “X” + 1
解析为:
函数getline < ( “X” + 1 )
类似的问题也出现在 | 版本的 函数getline,特别是与 $.
例如:
$"回声 你好 ” | 函数getline
(这种情况在用于 打印 声明,其中
|获取线 部分可能是重定向 打印.)
因为在大多数情况下,不会(或至少不应该)使用此类构造(因为它们
具有自然的歧义性,没有常规的解析),这些的含义
结构已明确未指定。 (其效果是,符合
遇到问题的应用程序必须添加括号以解决歧义。)
这种结构的实际使用似乎很少。
在这些情况下编写的语法可能会导致错误。 在哪里
向后兼容性不是一个大的考虑因素,实现者可能希望使用这样的
语法。
一些历史实现允许调用一些内置函数而无需
参数列表,结果是在某些“合理”中选择的默认参数列表
方式。 用于 长度 作为...的同义词 长度($0) 是这些形式中唯一的一种
被认为广为人知或广泛使用; 这种特殊的形式被记录在各种
地点(例如,最具历史意义的 AWK 参考页,尽管不在参考页中
这个 AWK 代码编程 语言)作为合法的做法。 除了这个例外,默认
参数列表一直没有记录且定义模糊,而且根本不是
明确如何(或是否)将它们推广到用户定义的函数。 他们没有添加任何有用的
功能并排除未来可能需要命名函数的扩展
没有打电话给他们。 不对它们进行标准化似乎是最简单的做法。 标准
开发商认为 长度 然而,值得特殊对待,因为它已被
过去有记录,并且可能在历史程序中大量使用。
因此,这种用法已变得合法,但第 5 版删除了过时的
为符合 XSI 的实现和许多其他符合标准的应用程序进行标记
取决于这个功能。
In 分 和 格子如果 代表 是一个字符串文字(词汇标记 STRING),然后是两个
连续的字符串中应使用字符以确保单个
将先于当结果字符串传递给
功能。 (例如,指定一个文字在替换字符串中,使用
格子(ERE, "\\&")。)
历史上唯一的特殊人物 代表 的论点 分 和 格子 绳子
函数是('&') 字符并在其前面加上
字符用于关闭其特殊含义。
ISO POSIX-2:1993 标准中的描述引入了这样的行为:
字符是另一个特殊字符,未指定是否有
还有其他特殊字符吗? 这个描述介绍了几个可移植性
问题,其中一些在下面描述,因此已被替换为更多
历史描述。 其中一些问题包括:
* 从历史上看,要创建替换字符串,脚本可以使用 格子(ERE, "\\&"),
但根据 ISO POSIX-2:1993 标准措辞,有必要使用 格子(ERE,
“\\\\&”)。 这字符在这里加倍,因为所有字符串文字都是
进行词法分析,这会减少每对字符到
一个单一的在传递给之前 格子.
* 由于未指定特殊字符是什么,对于可移植脚本来说
保证字符按字面打印,每个字符必须在前面
与一个。 (例如,可移植脚本必须使用 格子(ERE, “\\你好”),以
产生一个替换字符串 “你好”.)
ISO POSIX-2:1993 标准中的比较描述没有正确描述
历史实践是因为数字字符串与数字进行比较的方式。 这
当前规则导致以下代码:
if (0 == "000")
打印 “奇怪的, 但是 真的”
其他
打印 “不是 真的”
进行数字比较,导致 if 成功。 应该是直观明显的
这是不正确的行为,事实上,历史上没有实施过 AWK 通
行为方式是这样的。
为了解决这个问题,定义 数字 绳子 被增强为仅包括那些
从特定环境(主要是外部来源)获得的值,但并非如此
可以明确地确定该值是字符串还是
数字。
分配给数字字符串的变量也应被视为数字字符串。
(例如,数字字符串的概念可以跨赋值传播。)
比较时,所有具有未初始化值的变量都将被视为数字
操作数的计算结果为零。
未初始化的变量包括所有类型的变量,包括标量、数组元素、
和领域。 未初始化值的定义 变量 和 Special 变量 is
描述未初始化变量和已初始化字段的值是必要的
有效(例如, < $NF)但其中没有字符并描述这些
比较时要使用变量。 有效字段,例如 $1,没有字符
其中可以从输入行获得 “\t\t” ,尤其是 FS='\t'。 从历史上看,
比较 (1 美元10) 评估后进行数值计算 $1 到零值。
删除了短语“...也应具有数字字符串的数值”
来自 ISO POSIX-2:1993 标准的几个部分,因为它指定了不必要的
实施细节。 POSIX.1‐2008 没有必要指定这些对象
被赋予两个不同的值。 只需要指定这些对象可以
根据上下文评估为两个不同的值。
的历史实现 AWK 未解析十六进制整数或浮点常量
喜欢 “0×a” 和 “0xap0”。 由于疏忽,本指南 2001 年至 2004 年的版本
标准要求支持十六进制浮点常量。 这是由于
参考 阿托夫()。 此版本的标准允许但不要求
使用的实现 阿托夫() 并包含浮点数的描述
被认为是符合历史行为的替代方案。 此更改的目的是
允许实现根据以下任一方式识别浮点常量
ISO/IEC 9899:1990 标准或 ISO/IEC 9899:1999 标准,并允许(但不要求)
识别十六进制整数常量的实现。
的历史实现 AWK 不支持浮点无穷大和 NaN
数字 字符串; 例如, “-INF” 和 “南”。 然而,使用的实现 阿托夫() 要么
斯特德如果执行转换的 () 函数使用了这些值,则它们会获得对这些值的支持
ISO/IEC 9899:1999 标准版本的功能代替 ISO/IEC 9899:1990 标准
版本。 由于疏忽,该标准的 2001 年至 2004 年版本没有
允许支持无穷大和 NaN,但在此版本中允许支持(但不允许
必需的)。 这是行为的无声改变 AWK 程式; 例如,在
POSIX 语言环境表达式:
(“-INF” + 0 < 0)
以前的值为 0,因为 “-INF” 转换为 0,但现在它的值可能为 0 或
1.
未来 如何前往
无。
使用 onworks.net 服务在线使用 awkposix