我想从文件中查找特定的命令/单词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
也被淘汰了。
答案 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