【问题标题】:Removing number of the end of the filename without the extension [duplicate]删除不带扩展名的文件名末尾的数字[重复]
【发布时间】:2019-12-08 05:28:32
【问题描述】:

我有几个文件需要从文件扩展名中提取并删除每个文件末尾的数字

test1.alarms
abcd1.alarms
test2.alarms
abcd2.alarms

下面是我使用的代码。第一部分工作删除了文件扩展名并重新插入到文件中,但是,我无法删除每个文件的编号。获得结果后,我会将其重新插入文件中。

for f in *.alarms; do
base=$(basename "$f" '.alarms')
sed --i "s/^/$base\:/" $f
db_name=`echo $base | grep -o [a-z]`
sed -ie "s/^/$db_name\:/" -i $f
done

结果应该是

test
abcd
test
abcd

【问题讨论】:

  • remove the number at the end of each file - 你想mv 文件吗?现在你的脚本试图操纵文件的内容,而不是文件名,不知道,这是故意的吗?
  • db_name=$(echo $f | sed 's/[0-9]\.alarms$//') 怎么样?
  • 点没有特殊意义。如果您想删除[0-9].alarm,那么,就这样做吧。 basename 不能单独完成,但副本显示了如何进行各种模式替换(然后你根本不需要 basename)。

标签: bash


【解决方案1】:

单行解决方案怎么样:

printf '%s\n' *.alarms | sed 's/[[:digit:]]*\.alarms$//g'

printf 接收的参数多于值格式时,它会为每个额外的参数重复格式字符串:

printf '%s\n' *.alarms: 将所有匹配通配符*.alarms 的文件名扩展为每个文件名的参数。

%s\n 格式字符串将导致每个文件名参数打印一个换行符 \n,从而有效地生成一个以换行符分隔的文件名列表,匹配 *.alarms 模式。

这种方法优于 ls 的命令输出的不可靠解析。

【讨论】:

【解决方案2】:

我会使用 sed。

ls *.alarms | sed 's/[0-9][.]alarms//'

【讨论】:

  • 解析ls的输出不是一个值得推荐的做法^^
  • 是的,我明白了。由于解析包含用于着色的 ANSI 标记的 ls,我的脚本中断了。呃,好烦。因此,我通常会使用 --colors=never 选项。
猜你喜欢
  • 1970-01-01
  • 2011-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 2014-09-19
  • 2017-07-12
相关资源
最近更新 更多