删除间距可能不同的重复行,但忽略以 # 开头的行

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)

我的语法有什么问题?

Adm*_*Bee 6

怎么样

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 #.