Ubuntu:终端删除部分字符串



我想使用 Ubuntu 终端重命名文件夹中的数百个文件,因为我不允许安装任何东西。

文件的名称采用以下格式:ER201703_Company_Name_Something_9876543218_90087625374823.csv之后它应该看起来像这样:ER201703_9876543218_90087625374823.csv

所以,我想删除中间部分(Company_name_something(,它有时有 2、3 甚至 4 个_。我想创建 2 个字符串;一个用于前部,一个用于后部。前部很容易并且已经在工作了,但我正在与后部作斗争。

for name in *.csv;
do
    charleng=${#name};
    start=$(echo "$name" | grep -a '_9');
    back=$(echo "$name" | cut -c $start-);
    front=$(echo "$name" | cut -c1-9);  
    mv "$name""$front$back";
done

我试图找到 _9 的位置并保留从那里到字符串末尾的所有内容。

此致敬意一月

如果安装了rename(我认为 Ubuntu 就是这种情况(,您可以使用以下命令而不是循环。

rename -n 's/^(ERd*)w*?(_9w*)/$1$2/' *.csv

删除-n(无操作(以应用更改。

解释

  • s/.../.../ 将左正则表达式的匹配项替换为右模式。
  • (ERd*)匹配第一部分(ER后跟一些数字(并将其存储在$1中以供以后使用。
  • w*?与公司部分相匹配,即尽可能少(非贪婪(的单词字符(字母、数字、下划线等(。
  • (_9w*)与第二部分匹配,并将其存储在$2中以供以后使用。
  • $1$2是替换先前匹配的零件。我们只省略了公司部分。
awk -F'_' '{printf "mv %s %s_%s_%sn",$0,$1,$(NF-1),$NF}' 

例:

kent$  awk -F'_' '{printf "mv %s %s_%s_%sn",$0,$1,$(NF-1),$NF}' <<<"ER201703_Company_Name_Something_9876543218_90087625374823.csv"                                         
mv ER201703_Company_Name_Something_9876543218_90087625374823.csv ER201703_9876543218_90087625374823.csv

此单行将打印出mv old new命令。如果没问题,您只需将输出通过管道传输到|sh , ( awk ....|sh (,重命名将完成。

如果您的文件名可以包含空格,请考虑用双引号引用文件名。

我可以提供替代解决方案,可能更通用。

rename 's/^([^_]+(?=_))(?:w+(?=_d+))(_d+_d+.csv)$/$1$2/' *.csv

在这种情况下,日志的名称将更改,您希望拥有强大的正则表达式。

([^_]+(?=_)) - match everything that not underscore till the first one and store it to $1
(?:w+(?=_d+)) - match chars until the numbers but (?:...) not store to var
(_d+_d+.csv) -  match set of numbers and file extension and store it to $2

最新更新