sed命令用于修改文件名

sed command to be used to modify the file name

我可以使用 sed 命令来做一些简单的事情,但我有一个问题,这个问题对我来说很复杂,无法自己找到解决方案,所以如果有人能帮助我,那将是一个很大的帮助。

示例:我该如何修改如下文件?

orig_file_name = OBIEE_S99_TT_PLV_BI0026.rpd
target_file_name = OBIEE_S99_TT_PLV.rpd

所以在我的 bash 脚本中,我将执行以下操作。 1.检查目录中的最新文件。 2. 选择该文件并修改其名称,与上面类似。

情况:我总是不知道文件名是什么,但我知道模式的一部分,文件名总是以 "something_is_name_xxxx.rpd" 结尾 那么我想将文件名修改为 "something_is_name.rpd"

我会做这样的事情,但我不怀疑有更好的解决方案。

for f in $(ls -1t OBIEE_S99_TT_PLV* | head -1)
do
    mv $f $(echo $f | sed 's/_BI[0-9]*//g')
done

如果您知道文件名遵循您描述的模式,您可以使用

target_file_name="${orig_file_name%_*}.${orig_file_name##*.}"

这里${orig_file_name%_*}是文件名最后_之前的部分,${orig_file_name##*.}是最后.之后的部分。这总是 rpd,想想看,所以

target_file_name="${orig_file_name%_*}.rpd"

也适用于您的情况。

这些扩展是 bash 特定的。 "Parameter Expansion."

下的 bash 手册页对它们进行了更详细的描述
man rename 

可以提供帮助,没有 sed,但是 perl。

我会在这个正则表达式中使用 sed:

$ echo OBIEE_S99_TT_PLV_BI0026.rpd | sed "s/^\(.*\)\(_[a-zA-Z0-9]\+\)\(\.rpd\)$//g"
OBIEE_S99_TT_PLV.rpd
  1. 这假定您的文件扩展名始终是 rpd,但也可以是 轻松改变
  2. 您可能不需要在脚本中转义括号

你知道你有多少条下划线吗? 更改以最后一个下划线开头的字符串:

echo OBIEE_S99_TT_PLV_BI0026.rpd | sed 's/_[a-zA-Z0-9]*.rpd$/.rpd/'

其他答案可能会更好,具体取决于您所知道的确切限制。 当你知道固定数量的下划线时,你甚至可以使用 cut:

echo $(echo OBIEE_S99_TT_PLV_BI0026.rpd | cut -d_ -f1-4).rpd