2017-09-22 76 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选项说明了什么将会发生而不是重命名。一旦你满意,只需删除它。

哦,还有一个最后的笔记。如果从所有这些文件名中删除日期,它们将全部具有相同的文件名。除非您的文件名称只是测试数据,否则您可能需要进一步考虑。