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

Bash sed-从文件的每行中删除日期,bash,sed,Bash,Sed,我正在努力摆脱这些日期——所有这些日期都是从2015年到现在的2017年。 我想将每个foo\u data\uu$date重命名为foo\u data.*。我只需要文件名。不是所有的个别日期。 我不理解sed的正则表达式——我可以用perl-nle'print/(foo\u data\ud\txt+txt)在perl中实现它,但我不知道如何使用sed实现它。 我想在sed中这样做,因为我一直在使用sed-I标志并在适当的位置更改文件 cat /tmp/foo | head | sed -e 's

我正在努力摆脱这些日期——所有这些日期都是从2015年到现在的2017年。 我想将每个
foo\u data\uu$date
重命名为
foo\u data.*
。我只需要文件名。不是所有的个别日期。 我不理解sed的正则表达式——我可以用perl-nle'print/(foo\u data\ud\txt+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

你可以像这样运行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'

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

您可以这样运行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'

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

您不需要提及foo_数据:

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

您的命令错误:
/foo\u data\u 20*txt/
将匹配“0”0或更多次(类似于
foo\u data\u 2000000000txt
)。

您不需要提及foo\u数据:

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

您的命令错误:
/foo\u data\u 20*txt/
将匹配“0”0或更多次(类似于
foo\u data\u 2000000000txt
)。

如果您只想重命名文件,大多数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
选项显示将发生什么,而不是进行重命名。一旦你满意了,就把它拿走


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

如果您只想重命名文件,大多数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
选项显示将发生什么,而不是进行重命名。一旦你满意了,就把它拿走


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

我认为OP实际上希望结果中包含
*
。只需在最后一个斜杠前添加
*
。无需在替换的右侧引用
*
。此外,除非一行中有多个替换项,否则末尾不需要
g
。我认为OP实际上想要
*
。只需在最后一个斜杠前添加
*
。无需在替换的右侧引用
*
。此外,除非一行中有多个替换项,否则末尾不需要
g