grep:无效的正则表达式

时间:2015-04-29 01:04:39

标签: linux bash shell grep text-files

我有一个文本文件,如下所示:

haha1,haha2,haha3,haha4
test1,test2,test3,test4,[offline],test5
letter1,letter2,letter3,letter4
output1,output2,[offline],output3,output4
check1,[core],check2
num1,num2,num3,num4

我需要排除所有那些有" []"并将它们输出到另一个文件,而不是所有那些具有" []"。

的行

我目前正在使用此命令:

grep ",[" loaded.txt | wc -l > newloaded.txt

但它给了我一个错误:

  

grep:无效的正则表达式

4 个答案:

答案 0 :(得分:7)

使用grep -F将搜索模式视为固定字符串。您也可以将wc -l替换为grep -c

grep -cF ",[" loaded.txt > newloaded.txt

如果您有点好奇,[是一个特殊角色。如果你不使用-F,那么你需要用反斜杠来逃避它。

grep -c ",\[" loaded.txt > newloaded.txt

顺便说一下,我不确定你为什么要使用wc -l呢?从您的问题描述中,听起来grep -v可能更合适。 -v会反转grep的正常输出,打印匹配的行。

grep -vF ",[" loaded.txt > newloaded.txt

答案 1 :(得分:1)

Grep的替代方法

目前还不清楚是否要删除可能包含括号[]的行,或仅删除括号专门包含字符的行。无论您打算使用哪种方法,sed都可以轻松删除符合确定模式的行:

仅删除包含字符[...]周围的括号的行:

sed '/\[.*\]/d' loaded.txt > newloaded.txt

另一种方法可能是删除包含任一括号的任何行:

sed '/\[/d;/\]/d' loaded.txt > newloaded.txt

(例如,包含[]的行将被删除)

答案 2 :(得分:0)

您的grep命令似乎没有排除任何内容。另外,你为什么要使用wc?我以为你想要的是线条,而不是他们的数量。

因此,如果你只是想要那些没有[]的行,那么这应该有效:

grep -v "\[" loaded.txt > new.txt

答案 3 :(得分:0)

您也可以使用awk

awk -F\[ 'NF==1' file > newfile
cat newfile
haha1,haha2,haha3,haha4
letter1,letter2,letter3,letter4
num1,num2,num3,num4

或者这个:

awk '!/\[/' file