Unix:使用sed从文件名中删除日期而不修改现有的

时间:2016-09-23 16:01:35

标签: bash shell date unix sed

我有一个遗留代码,只有在命令中有日期时才传输文件。但客户端传输不希望将日期附加到文件名。遗留代码无法修改,因为许多其他传输依赖于它。所以我的要求是我希望在命令中有日期参数,但同样必须使用单个命令删除它。

遗留代码中的条件:

 grep '\`date' $COMMAND

注意:COMMAND将包含下面定义的完整命令,而不是文件名(不是CMD输出)。

理想情况下,我的命令应该添加日期。我在下面添加了一个命令。

CMD=`echo prefix_filename.txt | sed 's/^prefix_//'`_`date +%m%d%Y`

上述命令用于删除prefix_和send filename。这里我输出为filename.txt_09232016。由于遗留代码逻辑只检查命令是否有“日期”,我添加了它。有没有办法在同一个命令中再次删除日期,以便我的输出将是filename.txt

当前输出:

filename.txt_09232016

预期产出:

 filename.txt

3 个答案:

答案 0 :(得分:2)

在日期部分之前获取文件名:

echo 'filename.txt_09232016' | grep -o '^.*\.txt'

或者从文件末尾删除日期:

echo 'filename.txt_09232016' | sed 's/_[0-9]\+$//'

答案 1 :(得分:1)

您可以采取一些措施来改进/简化代码。主要的是bash有非常好的内置字符串操作。另一个原因是你应该使用$(...)而不是`...`表示法:

CMD=`echo prefix_filename.txt | sed 's/^prefix_//'`_`date +%m%d%Y`

可以替换为

ORIG=prefix_filename.txt
CMD=${ORIG#prefix_}_$(date +%m%d%Y)

继续,

echo $CMD
NODATE=${CMD%_*}
echo $NODATE

打印

filename.txt_09232016
filename.txt

构造${var#pattern}从变量的开头删除最短的pattern:在这种情况下,prefix_。同样,构造${var%pattern}会从字符串末尾删除最短的pattern:在这种情况下_*

在第一种情况下,您可以使用${var##pattern},因为prefix_是固定字符串。但是,在第二种情况下,您无法使用${var%%pattern},因为您要确保仅从最后一个下划线开始截断,而不是第一个下划线,并将日期指定为动态模式。

正如一个FYI,这些链接指向www.tldp.org,其中包含迄今为止我遇到过的最佳Bash手册。它有时会变得密集,但最终解释通常是值得的。

答案 2 :(得分:0)

就这样做:

echo filename.txt_09232016 | sed s/_[^_]*$//

在这里,你要替换(没有)'_'和所有后续字符,直到字符串($)的结尾,因为它们都是'_'的不同(^)。

相关问题