Unix:在单个命令中从字符串中删除日期

时间:2016-10-03 00:39:22

标签: shell unix

为了满足遗留代码,我必须将日期添加到如下所示的文件名(它绝对需要并且不能修改遗留代码:()。但是我需要在同一命令中删除日期而不需要换行。从文本文件中读取此命令,因此我应该在单个命令中执行此操作。

$((echo "$file_name".`date +%Y%m%d`| sed 's/^prefix_//') 

所以这里我从文件名中删除前缀并添加一个附加到filename的日期。我也想删除我添加的日期。例如:prefix_filename.txt或prefix_filename.zip应该给我如下。

预期产出:

filename.txt
filename.zip

当前输出:

filename.txt.20161002
filename.zip.20161002

5 个答案:

答案 0 :(得分:0)

假设所有文件都格式化为filename.ext.date,您可以将输出传递给'cut'命令并仅获取第1和第2个字段:

~> X=filename.txt.20161002
~> echo $X | cut -d"." -f1,2
filename.txt

答案 1 :(得分:0)

我不确定我是否正确理解了您的问题,但也许这样做符合您的要求:

$((echo "$file_name".`date +%Y%m%d`| sed -e 's/^prefix_//' -e 's/\.[^.]*$//') 

答案 2 :(得分:0)

示例输入:

cat sample
prefix_original.txt.log.tgz.10032016
prefix_original.txt.log.10032016
prefix_original.txt.10032016
prefix_one.txt.10032016
prefix.txt.10032016
prefix.10032016

grep从字符串的开头到字面点"."后跟数字。

grep -oP '^.*(?=\.\d)' sample
prefix_original.txt.log.tgz
prefix_original.txt.log
prefix_original.txt
prefix_one.txt
prefix.txt
prefix

或许应该使用以下内容:

grep -oP '^.*(?=\.\d)|^.*$' sample 

答案 3 :(得分:0)

如果我正确理解你的问题,你想从变量中删除日期部分,并且你已经从上下文中知道变量DOES包含一个日期部分,并且该部分位于名称中的最后一个句点之后。 / p>

在这种情况下,问题归结为删除最后一个时期以及后来的时间。

这可以通过

完成(Posix shell,bash,zsh,ksh)
 filename_without=${filename_with%.*}

假设 filename_with 包含最后有日期部分的文件名。

答案 4 :(得分:0)

  % cat example
filename.txt.20161002
filename.zip.20161002

  % cat example  |  sed "s/.[0-9]*$//g"
filename.txt
filename.zip

 %