sed - 从每行文件中删除日期

时间:2017-09-22 22:05:54

标签: bash sed

我正试图摆脱日期 - 所有这些都是从2015年至2017年。 我想将每个foo_data_$date重命名为foo_data_*。我只需要文件名。不是所有的日期。 我不明白sed的正则表达式 - 我可以使用perl -nle' print /(foo_data _)\ d + txt)在perl中完成它,但是无法弄清楚如何用sed来完成它。 我想在sed中这样做,因为我一直在使用sed -i标志并更改文件。

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

3 个答案:

答案 0 :(得分: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'

然后,您将从文件中的文件名中删除日期。

答案 1 :(得分:0)

您不需要提及foo_data:

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

您的命令错误:/foo_data_20*txt/将匹配' 0' 0次或更多次(类似foo_data_2000000000000txt)。

答案 2 :(得分: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选项显示会发生什么而不是重命名。一旦您满意,只需将其删除即可。

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