yae*_*ael -4 awk text-processing
这是对先前问题的跟进。即使字段的间距不同,我也使用此语法来删除重复的行
awk '{$1=$1};!NF||!seen[$0]++' /tmp/fstab
Run Code Online (Sandbox Code Playgroud)
现在我想排除以#
. 所以我使用这个语法
awk '/^#/ || "'!'"'{$1=$1};!NF||!seen[$0]++' /tmp/fstab
-bash: !: event not found
Run Code Online (Sandbox Code Playgroud)
我的语法有什么问题?
怎么样
awk '!NF||$1~/^#/ {print; next} {$1=$1} !seen[$0]++' /tmp/fstab
Run Code Online (Sandbox Code Playgroud)
这将立即打印不变的任何行,它是空的或第一个字段以开头的行#
,然后跳过执行,以便绕过任何进一步的代码。只要尚未遇到所有其他行,就会重建并打印它们。
检查 if$1~/^#/
而不是将匹配应用于整行(即简单地/^#/
)的原因是,通过这种方式,我们还可以捕获#
前面有空格的注释行。尽管手册页fstab
要求为了有资格作为注释行,第一个字符必须是 a #
,正如@StephenKitt 指出的,Linux 实现libmount
将跳过前导空格并接受一行作为注释,如果第一个非空格字符是 a #
.