Regex 如何从文件中删除不带';不匹配正则表达式?

Regex 如何从文件中删除不带';不匹配正则表达式?,regex,linux,file,csv,grep,Regex,Linux,File,Csv,Grep,我有一个大文件,看起来像这样: 7f0c41d6-f9c6-47aa-a034-d40bc629c973.csv 159890 159891 24faaed6-62ee-4175-8430-5d73b09911c8.csv 159907 5bad221f-25ef-44fa-9086-fd152e697928.csv 642e4ac3-3d46-4b4c-b5c8-aa2fa54d0b04.csv d0e145a5-ceb8-4d4b-ae47-11e0c9a6548d.csv 159929 b

我有一个大文件,看起来像这样:

7f0c41d6-f9c6-47aa-a034-d40bc629c973.csv
159890
159891
24faaed6-62ee-4175-8430-5d73b09911c8.csv
159907
5bad221f-25ef-44fa-9086-fd152e697928.csv
642e4ac3-3d46-4b4c-b5c8-aa2fa54d0b04.csv
d0e145a5-ceb8-4d4b-ae47-11e0c9a6548d.csv
159929
ba678cbd-af57-493b-a69e-e7504b4bc328.csv
7750840f-9bf9-4a68-9f25-a2ba0968d481.csv
159955
159959
我只对
*.csv
文件感兴趣,有人能告诉我如何删除不以
.csv
结尾的文件吗

多谢各位

grep "\.csv$" file 
将仅拉出以.csv结尾的行

然后,如果你想把它们放在不同的文件中

grep "\.csv$" file > newfile

sed
是你的朋友:

sed -i.bak '/\.csv$/!d' file
-i.bak:就地编辑。创建扩展名为.bak的备份文件

这是只选择以.csv扩展名结尾的文件名的正则表达式代码


希望这能对您有所帮助。

如果您熟悉vim文本编辑器(vim或vi通常安装在许多linux机器上),请使用以下vim Ex mode命令删除与特定模式不匹配的行:

:v/<pattern>/d

希望这能有所帮助。

如果您不想为了删除不需要的文件而将文件名保存在另一个文件中,那么这也可能是满足您需要的附加解决方案(请理解这是一个老问题)

此单行
for
循环使用
grep“\.csv”文件
解决方案,这样您就不需要管理保存在此处或此处的多个文件名

for f in *; do if [ ! "$(echo ${f} | grep -Eo '.csv')" == ".csv" ]; then rm "${f}"; fi; done
作为一个直观的帮助,向您展示了它的工作原理(用于删除除csv文件以外的所有文件),这里有一个快速而肮脏的屏幕截图,显示了使用示例输出的结果

这是单行命令的一个略短版本:

for f in *; do if [ ! "$(echo ${f} | grep -o '.csv')" ]; then rm "${f}"; fi; done
下面是使用示例的csv文件名和一些随机生成的文本文件的示例输出

使用这种带条件的循环的目的是保证您只删除想要删除的文件(非csv文件),并且只删除当前工作目录中的文件,而不解析
ls
命令


希望这能帮助您和其他正在寻找类似解决方案的人。

该工具的名称是什么?
for f in *; do if [ ! "$(echo ${f} | grep -Eo '.csv')" == ".csv" ]; then rm "${f}"; fi; done
for f in *; do if [ ! "$(echo ${f} | grep -o '.csv')" ]; then rm "${f}"; fi; done