Grep不起作用

时间:2013-03-24 22:00:44

标签: shell unix grep

这对我不起作用

grep -vE '^\..*' tmp1.txt >grep.txt
grep -vE '^le-.*\.sh' grep.txt >tmp1.txt

之前的

tmp1.txt

.config
le-test.sh
a b c

之后

.config
le-test.sh
a b c
有谁帮忙?

2 个答案:

答案 0 :(得分:1)

以下是您使用的grep:grep -vE "^\.|^le-[^.]+\.sh" FILE

答案 1 :(得分:1)

你跑步时看到了什么:

$ grep -vE '^\.' tmp1.txt
le-test.sh
a b c
$ grep -E '^\.' tmp1.txt
.config
$ 

(正则表达式上的尾随.*不会添加或删除任何数据行)。你应该看看我展示的东西;如果您真的没有看到我展示的内容,那么您需要开始查看grep版本-Eegrep选项的影响。应该使用扩展正则表达式启用“$ grep -e '^\.' tmp1.txt .config $ grep -ve '^\.' tmp1.txt le-test.sh a b c $ - mode”,而不是扩展正则表达式。尝试:

-e

小写grep只是说下一个参数是正则表达式。如果您仍然没有显示输出,那么您可能没有使用/usr/bin/grep的常规版本。您需要查看正在运行的内容。您可以尝试运行grep --version或测试它是否是le-等的GNU版本。

假设您可以获得第一阶段过滤所显示的输出,那么第二阶段也应该起作用。您说要删除'以.sh开头并以.sh'结尾的文件,但您的第二个正则表达式仅在le-开始后需要$ grep -vE '^\.' tmp1.txt | grep -E '^le-.*\.sh$' le-test.sh $ grep -vE '^\.' tmp1.txt | grep -vE '^le-.*\.sh$' a b c $ ;它没有指定结束:

\.sh$

悲伤的一个可能原因是,如果您的数据文件具有Windows行结尾(CRLF),但您在Unix上运行测试。正则表达式的'\r'部分会失败,因为在行结束之前还有CR(回车符$ grep -E '^(\.|le-.*.sh$)' tmp1.txt .config le-test.sh $ grep -vE '^(\.|le-.*.sh$)' tmp1.txt a b c $ )。但是,这不应该影响过滤过程的第一部分。

你应该可以在一个命令中使用:

完成所有操作
-E

此版本确实需要|标志;交替{{1}}和用于分组的括号需要它。