2017-09-22 62 views
0

我試圖擺脫日期 - 所有這些日期從2015年至今2017. 我想將每個foo_data_$date重命名爲只foo_data_*。我只需要文件名稱。不是所有的個別日期。 我不明白sed的正則表達式 - 我可以在perl中使用perl -nle'print /(foo_data _)\ d + txt),但無法弄清楚如何使用sed來完成它。 我想在sed中這樣做,因爲我一直在使用sed -i標誌並更改文件。sed - 從文件的每一行中刪除日期

cat /tmp/foo | head | sed -e 's/foo_data_20*txt/foo_data_\*/g' 
foo_data_20150901.txt 
foo_data_20150902.txt 
foo_data_20150906.txt 
foo_data_20150907.txt 
foo_data_20150908.txt 
foo_data_20150909.txt 
foo_data_20150912.txt 

回答

2

你可以像這樣運行sed。

sed -e 's/foo_data_[0-9]*/foo_data_/g' 

現在,爲了在2015年到2017年之間捕獲日期,這將成爲現實。

sed -e 's/foo_data_201\(5\|6\|7\)[0-9]*/foo_data_/g' 

然後,您將刪除文件中文件名的日期。

+0

我認爲OP實際上需要'*'結果。只需在最後一個斜槓前添加'*'即可。沒有必要引用替換右側的'*'。另外,除非在一條線上有多個替代品,否則最後不需要'g'。 –

0

您不必提foo_data:

sed -i 's/201[567][01][0-9][0-3][0-9]//' 

你的命令是錯誤的:/foo_data_20*txt/將匹配一個 '0' 0次以上(類似foo_data_2000000000000txt)。

0

如果你只是想重命名這些文件,大多數Linux發行版(假設你的Linux是)有一個rename工具,處理Perl的正則表達式就好:

pax> touch pax_100.txt ; touch pax_200.txt 
pax> rename -n 's/_(\d)/_diablo_$1/' pax* 
rename(pax_100.txt, pax_diablo_100.txt) 
rename(pax_200.txt, pax_diablo_200.txt) 

-n選項說明了什麼將會發生而不是重命名。一旦你滿意,只需刪除它。

哦,還有一個最後的筆記。如果從所有這些文件名中刪除日期,它們將全部具有相同的文件名。除非您的文件名稱只是測試數據,否則您可能需要進一步考慮。