我正试图摆脱日期 - 所有这些都是从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
答案 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
选项显示会发生什么而不是重命名。一旦您满意,只需将其删除即可。
哦,还有最后一点。如果从所有这些文件名中删除日期,它们都将具有相同的文件名。除非您的文件名只是测试数据,否则您可能需要进一步考虑。