-2

这对我不起作用

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

有人帮忙吗?

4

2 回答 2

1

运行时看到了什么:

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

(正则表达式的尾随.*不会添加或删除任何数据行)。你应该看看我展示的;如果您真的没有看到我展示的内容,那么您需要开始查看您的版本对grep选项-E的作用。它应该egrep使用扩展的正则表达式启用“-mode”,而不是扩展您的正则表达式。尝试:

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

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

假设您可以获得第一阶段过滤的输出,那么第二阶段也应该起作用。你说你想消除'以'开头le-和结尾的文件.sh,但你的第二个正则表达式只需要.shle-开始之后;它没有指定结束:

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

如果您的数据文件具有 Windows 行结尾 (CRLF),但您正在 Unix 上运行测试,可能会导致悲伤。正则表达式的部分会失败,因为在行尾之前\.sh$还有一个 CR(回车, )。'\r'但是,这不应该影响过滤过程的第一部分。

您应该能够通过以下命令在一个命令中完成所有操作:

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

这个版本确实需要-E标志;用于分组的交替|和括号需要它。

于 2013-03-24T22:41:27.587 回答
1

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

于 2013-03-24T22:10:35.087 回答