Ubuntu:终端删除部分字符串

时间:2017-04-05 14:07:08

标签: bash shell csv ubuntu terminal

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

文件名采用以下格式: ER201703_Company_Name_Something_9876543218_90087625374823.csv 之后它应该是这样的: ER201703_9876543218_90087625374823.csv

所以,我想删除中间部分(Company_name_something),有时候有2个,3个甚至4个_s。我想创建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的位置,并保留从那里到字符串末尾的所有内容。

祝你好运 扬

3 个答案:

答案 0 :(得分:0)

awk -F'_' '{printf "mv %s %s_%s_%s\n",$0,$1,$(NF-1),$NF}' 

示例:

kent$  awk -F'_' '{printf "mv %s %s_%s_%s\n",$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),重命名即可完成。

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

答案 1 :(得分:0)

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

rename -n 's/^(ER\d*)\w*?(_9\w*)/$1$2/' *.csv

删除-n无行为)以应用更改。

解释

  • s/.../.../用正确的模式替换左正则表达式的匹配。
  • (ER\d*)匹配第一部分(ER后跟一些数字)并将其存储在$1内以供日后使用。
  • \w*?匹配公司部分,即尽可能少的(非贪婪的)单词字符(字母,数字,下划线,...)。
  • (_9\w*)与第二部分匹配,并将其存储在$2内以供日后使用。
  • $1$2是以前匹配的部分的替代品。我们只省略了公司部分。

答案 2 :(得分:0)

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

non_emp_tree

如果日志名称发生变化,您希望拥有强大的正则表达式。

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