我想搜索文件并包含文本#!/bin/bash
,但排除任何其他具有#符号的行。这两个命令:grep -w '#!/bin/bash' file
和grep -v '^#' file
各自完成这项工作的一部分。我希望这是一个单一的命令,所以这就是我尝试过的。
grep -w '#!/bin/bash' | grep -v '^#' file
这不包括以#开头的行,但不包括行#!/bin/bash
grep -w '#!/bin/bash' -v '^#' file
这只是打印每一行,但#!/bin/bash
grep "^[^#]\|^#\!/bin/bash$" test.sh
说明:
^[^#]
意味着从与#
不同的东西开始\|
是一个或^#\!/bin/bash$
是确切的线#!/bin/bash
所以..看起来好像你试图从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