当AWK工具在重新编译$0时,如果记录为空格,则可能会导致行为不可预知。例如,以下代码将打印出预期的输出:
awk 'BEGIN {FS=":"}{OFS=FS}{if ($1 == "root"){$3="newpass"}; print}' /etc/passwd
然而,如果我们在文件中添加某些记录,这些记录只包含空格,则代码的行为将不可预知,因为AWK会试图重新编译空格。
为了解决此问题,我们可以使用以下代码之一来检测空格行并跳过它们:
awk 'BEGIN {FS=":"}{OFS=FS}{if (gsub(/^ *$/,"",$0))next;if ($1 == "root"){$3="newpass"}; print}' /etc/passwd
或者,
awk 'BEGIN {FS=":"}{OFS=FS}{if ($0 ~ /^ *$/)next;if ($1 == "root"){$3="newpass"}; print}' /etc/passwd
这些代码使用此正则表达式 (/^ *$/) 来检测空格行并使用“next”来跳过它们。
这样,我们可以确保在重新编译记录时不会遇到意外行为。