这对我不起作用
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
有谁帮忙?
答案 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
版本-E
对egrep
选项的影响。应该使用扩展正则表达式启用“$ 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}}和用于分组的括号需要它。