awk语句的解释

use*_*371 -3 unix shell awk ksh

我无法理解这句话:

awk '/^\/\*/ {f=1} {print f?"":$0} /\*\/$/ {f=0}'
Run Code Online (Sandbox Code Playgroud)

fed*_*qui 6

它通常打印一个文件,只有当它们位于一个注释块内时才显示空行,如下所示:

/*

*/
Run Code Online (Sandbox Code Playgroud)

说明

awk '/^\/\*/ {f=1} {print f?"":$0} /\*\/$/ {f=0}'
     ^^^^^^         ^^^^^^^^^^^^^  ^^^^^
        |                 |          |
        |                 |        match lines ending with */
                    print either the line or an empty line
     match lines starting with /* (\ is to escape the chars)
Run Code Online (Sandbox Code Playgroud)

分段:

/^\/\*/ {f=1}
Run Code Online (Sandbox Code Playgroud)

每当它找到以行开头的行时/*,它将f变量设置为1. ^引用beginning of string.在这种情况下,beginning of line.如果RS设置为与新行不同的内容,则可能会发生变化.

/\*\/$/ {f=0}
Run Code Online (Sandbox Code Playgroud)

每当它找到以...结尾的行时*/,它将f变量设置为0. $引用end of string.在这种情况下,end of line.

{print f?"":$0}
Run Code Online (Sandbox Code Playgroud)

打印空行或当前行(使用时访问$0).这相当于:

if (f == True)
   print $0
else
   print ""
Run Code Online (Sandbox Code Playgroud)

正如Ed Morton很好地评论,使用括号来避免错误更安全:

{print (f?"":$0)}
Run Code Online (Sandbox Code Playgroud)

例:

样本文件:

$ cat a
hello
/*aa
aaa
bbbj
*/
bye
Run Code Online (Sandbox Code Playgroud)

执行:

$ awk '/^\/\*/ {f=1} {print f?"":$0} /\*\/$/ {f=0}' a
hello




bye
Run Code Online (Sandbox Code Playgroud)