如何从文件中删除与正则表达式不匹配的行?

时间:2013-09-27 17:53:39

标签: 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
ba678cbd-af57-493b-a69e-e7504b4bc328.csv
7750840f-9bf9-4a68-9f25-a2ba0968d481.csv
159955
159959

我只对*.csv个文件感兴趣,有人可以指出我如何删除不以.csv结尾的文件。

谢谢。

5 个答案:

答案 0 :(得分:10)

grep "\.csv$" file 

只会拉出那些以.csv

结尾的行

然后,如果你想把它们放在另一个文件中;

grep "\.csv$" file > newfile

答案 1 :(得分:3)

sed是你的朋友:

sed -i.bak '/\.csv$/!d' file

-i.bak :就地编辑。使用 .bak 扩展名

创建备份文件

答案 2 :(得分:2)

 ([0-9a-zA-Z-]*.csv$)

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

希望这会对你有帮助。see this image for detail

答案 3 :(得分:1)

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

:v/<pattern>/d

例如,如果我想要删除所有不包含"column"的行,我会运行:

:v/"column"/d

希望这有帮助。

答案 4 :(得分:1)

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

此单行grep "\.csv" file以递归方式循环使用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

作为一个视觉辅助工具,向您展示它按预期工作(用于删除除csv文件之外的所有文件),这是一个快速而脏的屏幕截图,显示使用您的示例输出的结果。

enter image description here

以下是单行命令的略短版本:

ls

以下是使用示例的csv文件名和一些随机生成的文本文件的示例输出。

enter image description here

使用带条件的这种循环的目的是保证只在不解析class Test extends Component { state = { activeQuestion: 0, questions: { selectedAnswer: '' } } 命令的情况下,只在当前工作目录中清除自己想要的文件(非csv文件)。

希望这有助于您和正在寻找类似解决方案的任何其他人。