我有一个遗留代码,只有在命令中有日期时才传输文件。但客户端传输不希望将日期附加到文件名。遗留代码无法修改,因为许多其他传输依赖于它。所以我的要求是我希望在命令中有日期参数,但同样必须使用单个命令删除它。
遗留代码中的条件:
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
答案 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/_[^_]*$//
在这里,你要替换(没有)'_'和所有后续字符,直到字符串($)的结尾,因为它们都是'_'的不同(^)。