unix结合grep w和v命令

问题描述 投票:1回答:2

我想搜索文件并包含文本#!/bin/bash,但排除任何其他具有#符号的行。这两个命令:grep -w '#!/bin/bash' filegrep -v '^#' file各自完成这项工作的一部分。我希望这是一个单一的命令,所以这就是我尝试过的。

grep -w '#!/bin/bash' | grep -v '^#' file

这不包括以#开头的行,但不包括行#!/bin/bash

grep -w '#!/bin/bash' -v '^#' file

这只是打印每一行,但#!/bin/bash

unix grep
2个回答
0
投票
grep "^[^#]\|^#\!/bin/bash$" test.sh

说明:

  • ^[^#]意味着从与#不同的东西开始
  • \|是一个或
  • ^#\!/bin/bash$是确切的线#!/bin/bash

0
投票

所以..看起来好像你试图从bash文件中删除评论而不删除他们的shebang。

grep命令可以搜索正则表达式,但不太适用于应用逻辑规则。你可以这样做:

 grep -v '^#[^!]' input.sh

但你不能删除贴在行尾的注释。请注意,我对这个正则表达式更加自由,因为完全有可能脚本可能会使用除了/bin/bash以外的其他东西。 :-)

另一种可能性是使用awk。这使您可以应用无法在正则表达式中表达的逻辑。例如,如果您只想保留注释行,如果它是文件第一行的shebang,并删除所有其他注释,awk可以表示如下:

awk '
  NF==1 && /^#!/;      # if we're on the first line and find shebang, print.
  /^#/ { next }        # if this is a comment line, skip it.
  1                    # print everything else.
' input.sh
© www.soinside.com 2019 - 2024. All rights reserved.