2013-09-27 35 views
0

我有一個很大的文件,看起來像這樣:如何從文件中刪除與正則表達式不匹配的行?

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結尾的文件。

謝謝。

回答

8
grep "\.csv$" file 

將撤出只有那些以.csv

然後,如果你想把它們放在不同的文件結尾的行;

grep "\.csv$" file > newfile 
+1

+1'grep「\ .csv $」file> new_file';) – alfasin

+0

非常感謝,它的工作原理 – Vor

3

sed是你的朋友:

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

-i.bak:就地編輯。創建具有.bak的擴展

+0

謝謝你,這是一個很好的選擇。 – Vor

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

這是正則表達式的代碼,只有選擇具有的.csv擴展名結尾的文件名的備份文件。

希望這會幫助你。 see this image for detail

+0

工具的名稱是什麼? – Vor

+0

只有選擇線條才能解決問題 – jkshah

+0

@Vor它是[rubular](http://rubular.com/)。 – Jerry

1

如果你熟悉vim的文本編輯器(VIM或VI是很多Linux系統通常安裝),請使用以下的vim Ex模式命令刪除不匹配特定模式的行:

:v/<pattern>/d 

例如,如果我想刪除不包含"column"所有行我會運行:

:v/"column"/d 

希望這有助於。

1

如果您不想將文件的名稱保存在另一個文件中以刪除不需要的文件,那麼這也可能是您需要的附加解決方案(瞭解這是一個老問題)。

此單行for循環使用grep "\.csv" file解遞歸,因此您不需要管理多個文件名在這裏或那裏保存。

for f in *; do if [ ! "$(echo ${f} | grep -Eo '.csv')" == ".csv" ]; then rm "${f}"; fi; done 

作爲視覺輔助這裏向你展示它按預期工作(去除除了CSV文件中的所有文件)是使用您的樣本輸出結果的快速和骯髒的屏幕截圖。

enter image description here

這裏是單行命令的略短版本:

for f in *; do if [ ! "$(echo ${f} | grep -o '.csv')" ]; then rm "${f}"; fi; done 

這裏是它的使用樣本的CSV文件的名稱和一些隨機生成的文本文件樣本輸出。

enter image description here

目的使用這種循環與條件是保證你只掉你想要走了(非CSV文件),並只在當前工作目錄中的文件自己不必解析ls命令。

希望這可以幫助您和任何正在尋找類似解決方案的人。

相關問題