sed
是一个流编辑器。它以每行为基础处理字符流。它有一种原始的编程语言,包括 goto 式循环和简单的条件(除了模式匹配和地址匹配之外)。本质上只有两个“变量”:模式空间和保持空间。脚本的可读性可能很困难。数学运算充其量是极其尴尬的。
有各种版本sed
对命令行选项和语言功能提供不同级别的支持。
awk
面向每行的分隔字段。它具有更强大的编程结构,包括if
/else
, while
, do
/while
and for
(C 风格和数组迭代)。完全支持变量和一维关联数组以及 (IMO) 复杂的多维数组。数学运算类似于 C 中的数学运算。printf
和功能。 “AWK”中的“K”代表“Kernighan”正如《C 编程语言》一书的“Kernighan 和 Ritchie”中那样成名(不要忘记Aho and W艾因伯格)。人们可以想象使用以下方法编写一个学术剽窃检测器awk
.
GNU awk
(gawk
)有许多扩展,包括最新版本中的真正的多维数组。还有其他变体awk
包括mawk
and nawk
.
这两个程序都使用正则表达式来选择和处理文本。
我倾向于使用sed
文本中有模式的地方。例如,您可以将某些文本中“减号后跟数字序列”形式(例如“-231.45”)的所有负数替换为“会计师括号”形式(例如“(231.45)”) )使用这个(有改进的空间):
sed 's/-\([0-9.]\+\)/(\1)/g' inputfile
我会用awk
当文本看起来更像行和列时,或者像awk
指的是“记录”和“字段”。如果我要执行与上面类似的操作,但仅在简单的逗号分隔文件中的第三个字段上,我可能会执行以下操作:
awk -F, 'BEGIN {OFS = ","} {gsub("-([0-9.]+)", "(" substr($3, 2) ")", $3); print}' inputfile
当然,这些只是非常简单的示例,并不能说明每个示例必须提供的全部功能。