这对我不起作用
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
有人帮忙吗?
运行时看到了什么:
$ 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
,但你的第二个正则表达式只需要.sh
在le-
开始之后;它没有指定结束:
$ 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
标志;用于分组的交替|
和括号需要它。
这是您要使用的 grep:grep -vE "^\.|^le-[^.]+\.sh" FILE