使用带双引号的 awk 时如何否定模式

使用带双引号的 awk 时如何否定模式

我有以下文件:

$ cat files
foo.txt
bar.js

我希望使用 bash awk 只打印不以.js.

使用单引号 awk 时效果很好:

$ awk '$1 !~ /.js$/ {print $1}' files
foo.txt

但是,当使用双引号 awk 时:

$ awk "\$1 !~ /.js$/ {print \$1}" files
-bash: !~: event not found

答案1

不要那样做

使用简单的变量参数:

$ awk -v exclude='\.js$' '$1 !~ exclude' file
foo.txt

或者,通过环境导入模式(支持包含的模式的便捷方法\\):

$ exclude='\.js$' awk '$1 !~ ENVIRON["exclude"]' file

正如评论中提到的(现已删除):

$ awk "\$1 !""~ /.js$/ {print \$1}" file

可能有效,但它是不是推荐的方式。这只是简单的 丑陋的。了解如何使用正确的方法。

答案2

你是数百万人被愚弄的人之一历史扩展,默认情况下处于活动状态,即使只有千分之一的用户使用过它。

最好是使用set +H或在 shell 启动文件中禁用它set +o histexpand。然后就可以使用了!,不会出现奇怪的问题。

相关内容