我可以使用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"
答案 0 :(得分:1)
我会做这样的事情,但我不怀疑有更好的解决方案。
for f in $(ls -1t OBIEE_S99_TT_PLV* | head -1)
do
mv $f $(echo $f | sed 's/_BI[0-9]*//g')
done
答案 1 :(得分:1)
如果您知道文件名遵循您描述的模式,则可以使用
target_file_name="${orig_file_name%_*}.${orig_file_name##*.}"
此处${orig_file_name%_*}
是前一个_
之前的文件名的一部分,${orig_file_name##*.}
是最后一个.
之后的部分。总是rpd
始终考虑到它,所以
target_file_name="${orig_file_name%_*}.rpd"
也适用于你的情况。
这些扩展是特定于bash的。它们在“参数扩展”下的bash手册页中有更详细的描述。
答案 2 :(得分:1)
我会在这个正则表达式中使用sed:
$ echo OBIEE_S99_TT_PLV_BI0026.rpd | sed "s/^\(.*\)\(_[a-zA-Z0-9]\+\)\(\.rpd\)$/\1\3/g"
OBIEE_S99_TT_PLV.rpd
答案 3 :(得分:0)
man rename
可以帮助,没有sed,但perl。
答案 4 :(得分:0)
你知道你有多少张下划线吗? 从最后一个下划线开始更改字符串:
echo OBIEE_S99_TT_PLV_BI0026.rpd | sed 's/_[a-zA-Z0-9]*.rpd$/.rpd/'
其他答案可能会更好,具体取决于您所知道的确切限制。 当您知道固定数量的下划线时,您甚至可以使用剪切:
echo $(echo OBIEE_S99_TT_PLV_BI0026.rpd | cut -d_ -f1-4).rpd