来自评论文件的grep单词

时间:2014-06-30 07:40:01

标签: awk grep

我想从文件中查找特定的命令/单词int
但我想删除所有被评论的行 (我想忽略int是否在#之后)。

我的文件内容:

int a
def
abc int
adbc asdfj #int
abc # int
# int abc
abc int #
int # abc

我希望输出为:

int a
abc int
abc int #
int # abc 

我尝试使用grep -e "int" | grep -v -e "#"。 但问题是int # abc也被淘汰了。

6 个答案:

答案 0 :(得分:1)

我在这个有效的单正则表达式答案中看到了一些已删除的答案:grep '^[^#]*\<int\>'

grep '^[^#]*\<int\>' <<END
int a
def
abc int
adbc asdfj #int
abc # int
abc int #
int # abc
print abc  # int -- should not see this line
END
int a
abc int
abc int #
int # abc

int的两边都有#吗?在这种情况下你应该怎么办?

$ echo "int foo # int bar" | grep '^[^#]*\<int\>'
int foo # int bar

要查看文件中是否使用“int”,请使用grep的-q选项:

if grep -q '^[^#]*\<int\>' file; then 
    echo "I have an 'int'"
else
    echo "No int here"
fi

要将单词作为参数传递,您需要双引号,并转义反斜杠:

type="int"
if grep -q "^[^#]*\\<$type\\>"; then ...

答案 1 :(得分:0)

使用awk即可:

awk '/int/ && !/#.*int/' file
int a
abc int
abc int #
int # abc

这将获取包含int的所有行,但如果int #之后{{1}},则会忽略

答案 2 :(得分:0)

通过sed,

$ sed '/#.*int/d' file
int a
abc int
abc int #
int # abc

它只删除字符串int之后的行#符号。

答案 3 :(得分:0)

您可以使用perl吗?如果是这样的话,那就是小菜一碟:

perl -ne '/int/ && !/#(.*?)int/ && print' file 
int a
abc int
abc int #
int # abc

另一种方法是使用-P表示grep:

grep -Pv '#.*?int' file | grep int
int a
abc int
abc int #
int # abc

如果您想忽略所有评论,可以使用sed

grep -Pv '#.*?int' file | grep int | sed -re 's/#.*//g'
int a
abc int
abc int 
int 

使用变量而不是“int”:

i="int"; grep -Pv "#.*?$i" file | grep "$i"
int a
abc int
abc int #
int # abc

答案 4 :(得分:0)

这可能是你想要的,使用GNU awk进行单词边界:

$ awk -F'#' '$1~/\<int\>/' file
int a
abc int
abc int #
int # abc

取决于int之前和之后#出现{{1}}时您要执行的操作。

答案 5 :(得分:0)

awk '/abc int/ || /^int/' file
int a
abc int
abc int #
int # abc