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

Bash Unix:使用sed从文件名中删除日期,而不修改现有日期,bash,shell,date,unix,sed,Bash,Shell,Date,Unix,Sed,我有一个遗留代码,它只在命令中包含日期时传输文件。但客户端传输不希望将日期附加到文件名。无法修改旧代码,因为许多其他传输都依赖于它。因此,我的要求是,我希望在命令中包含date参数,但同样,必须使用单个命令删除该参数 旧代码中的条件: grep '\`date' $COMMAND 注意:命令将包含下面定义的完整命令,而不是文件名(不是CMD输出) 因此,理想情况下,我的命令应该添加“date”。我在下面添加了这样的命令 CMD=`echo prefix_filename.txt | sed

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

旧代码中的条件:

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

因此,理想情况下,我的命令应该添加“date”。我在下面添加了这样的命令

CMD=`echo prefix_filename.txt | sed 's/^prefix_//'`_`date +%m%d%Y`
上述命令用于删除前缀并发送文件名。这里我得到的输出是filename.txt09232016。由于遗留代码逻辑只检查命令中是否有'date',所以我添加了它。是否有办法在同一命令中再次删除日期,以便我的输出为filename.txt

电流输出:

filename.txt_09232016
预期产出:

 filename.txt

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

echo 'filename.txt_09232016' | grep -o '^.*\.txt'
或从文件末尾删除日期:

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

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

echo 'filename.txt_09232016' | grep -o '^.*\.txt'
或从文件末尾删除日期:

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

您可以做很多事情来改进/简化代码。主要的是bash具有非常好的内置字符串操作。另一个问题是,您可能应该使用
$(…)
而不是
``
符号:

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

ORIG=prefix\u filename.txt
CMD=${ORIG#prefix_}}{$(日期+%m%d%Y)
继续

echo $CMD
NODATE=${CMD%_*}
echo $NODATE
这张照片

filename.txt_09232016
filename.txt
该构造从变量开头删除最短出现的
模式
:在本例中为
前缀
。类似地,构造将从字符串末尾删除最短出现的
模式
:在本例中为
.*

在第一种情况下,您可以使用
${var##pattern}
,因为
前缀
是一个固定字符串。但是,在第二种情况下,您不能使用
${var%%pattern}
,因为您希望确保只截断最后一个下划线,而不是第一个下划线,并且日期指定为动态模式


仅供参考,链接指向的是目前为止我遇到的最好的Bash手册。它有时会变得很密集,但最终解释通常是值得的。

您可以做很多事情来改进/简化代码。主要的是bash具有非常好的内置字符串操作。另一个问题是,您可能应该使用
$(…)
而不是
``
符号:

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

ORIG=prefix\u filename.txt
CMD=${ORIG#prefix_}}{$(日期+%m%d%Y)
继续

echo $CMD
NODATE=${CMD%_*}
echo $NODATE
这张照片

filename.txt_09232016
filename.txt
该构造从变量开头删除最短出现的
模式
:在本例中为
前缀
。类似地,构造将从字符串末尾删除最短出现的
模式
:在本例中为
.*

在第一种情况下,您可以使用
${var##pattern}
,因为
前缀
是一个固定字符串。但是,在第二种情况下,您不能使用
${var%%pattern}
,因为您希望确保只截断最后一个下划线,而不是第一个下划线,并且日期指定为动态模式

仅供参考,链接指向的是目前为止我遇到的最好的Bash手册。它有时会变得很密集,但最终的解释通常是值得的。

只要这样做:

echo filename.txt_09232016 | sed s/_[^_]*$//
在这里,您将(不使用任何内容)替换“\u”和所有后续字符,直到字符串($)的结尾,因为它们都不同于“\u”。

只需执行以下操作:

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

在这里,您将(不使用任何内容)替换“\u”和所有后续字符,直到字符串($)的结尾,因为它们都与“\u”不同(^)。

我尝试添加
#date,但遗留代码检查了
date,结果不符合要求。我做错什么了吗?我在最近的更新中补充了这一点。如果我的CMD字符串有
date,并且如果为true,则会在旧代码中检查它。就是这样,HASCMD=
grep'`date'$CMD`你真的与这里的
sed
有联系吗?Bash可以在本地为您实现这一点,而无需启动一对单独的进程和管道。在遗留代码中,这是一件非常糟糕的事情。您是否有可能复制、修改旧代码,并将其仅用于您的进程?CMD命令在我手中。只能修改旧版本。我也可以使用其他选项,只是我需要在该命令中包含日期以满足遗留代码我尝试添加
#date,但遗留代码检查了
日期,但它不满足。我做错什么了吗?我在最近的更新中补充了这一点。如果我的CMD字符串有
date,并且如果为true,则会在旧代码中检查它。就是这样,HASCMD=
grep'`date'$CMD`你真的与这里的
sed
有联系吗?Bash可以在本地为您实现这一点,而无需启动一对单独的进程和管道。在遗留代码中,这是一件非常糟糕的事情。您是否有可能复制、修改旧代码,并将其仅用于您的进程?CMD命令在我手中。只能修改旧版本。我也可以使用其他选项,只是我需要在那个命令中有日期来满足遗留代码。谢谢让我试试这个。有没有办法,我可以将它合并到我当前的CMD语句中?因此,将输出分配给当前文件名为且日期为。。。filename=$(回显“$current\u filename\u with_date”| sed's/[0-9]\+$/'))谢谢:)但是在分配CMD的同一命令中进行此更改,而不是转到新行并再次删除日期时间戳,这是完全可能的。因为命令存储在文本文件中,脚本从中读取。CMD=中的内容都是从文本文件读取的谢谢让我试试这个。有没有办法,