[英]fIm trying to find a string betwen two match patterns and then add that string before a pattern using sed
[英]Add string in filename before pattern
我需要在匹配模式的文件名之間添加字符串。
樣本文件名:
file_1_my001
file_11_my0012
file_65_my_012
我想將它們重命名為:
file_1_my_copied_001
file_11_my_copied_0012
file_65_my_copied_012
模式為<any string>0<any string>
我的邏輯是首先獲取以0開頭的數字格式,將其存儲為模式,然后搜索該變量並將其替換為_copied_<variable>
。 我嘗試將數字提取為:
ls | sed -e s/[^0-9]//g
但是上面的命令正在獲取文件名中的所有數字,例如 1001, 110012, 65012
我無法使其搜索以0開頭的數字格式。請指導。
使用基於perl
的rename
命令:
$ touch file_1_my001 file_11_my0012 file_65_my_012
$ rename -n 's/_?(?=0)/_copied_/' file_*
rename(file_11_my0012, file_11_my_copied_0012)
rename(file_1_my001, file_1_my_copied_001)
rename(file_65_my_012, file_65_my_copied_012)
_?(?=0)
零或_
一個實例,后跟0
-n
選項用於空運行,看起來不錯后,刪除該選項以進行實際重命名
如果基於perl
的rename
不可用,請嘗試:
$ for file in file_* ; do echo mv "$file" $(echo "$file" | sed 's/_\?0/_copied_0/'); done
mv file_11_my0012 file_11_my_copied_0012
mv file_1_my001 file_1_my_copied_001
mv file_65_my_012 file_65_my_copied_012
如果可以,請將echo mv
更改為mv
以進行實際重命名
如果不存在0
之前的可選_
,則使用參數擴展會更容易
$ touch file_1_my001 file_11_my0012 file_65_my012
$ for file in file_* ; do echo mv "$file" "${file/0/_copied_0}"; done
mv file_11_my0012 file_11_my_copied_0012
mv file_1_my001 file_1_my_copied_001
mv file_65_my012 file_65_my_copied_012
ls | sed -e 's/\([_]*0\)/_copied_0/'
就像是,
$ sed -E "s/(.*[^0-9]+)(0[0-9]*)/\1_copied_\2/"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.