如何使用 sed 重命名文件?

如何使用 sed 重命名文件?

这是由贡献者创建的 sed 表达式。更具体地说,作者是@craig-sanders。

$FileToMove 设置为“2012-09-01 家庭保险 quote_zz20.pdf”

# use sed to extract folder number from filename.
FolderNo=$(echo "$FileToMove" | sed -r -e 's/.*zz([0-9]+)\.pdf/\1/')
# On my Mac, I figured that this command needs to be FolderNo=$(echo "$FileToMove" | sed -E -e 's/.*zz([0-9]+)\.pdf/\1/')

上面的命令用于从文件名中提取“20”。现在我想用 null 替换 zz20。

一直在努力去做。将学习sed,在此之前需要学习正则表达式。同时,我确信用 null 替换它是非常容易的。有小费吗?

答案1

我认为您想要重命名该文件并移动它。

使用我的原剧本作为基础,更改脚本的这一部分:

if [ "$NumFolders" -eq 1 ] ; then 
  mv "$ParentFolder/$FileToMove" "$TargetFolder/" 
else

像这样的事情:

if [ "$NumFolders" -eq 1 ] ; then
  NewFileName=$(echo "$FileToMove" | sed -E -e 's/_zz[0-9]+\././')
  mv "$ParentFolder/$FileToMove" "$TargetFolder/$NewFileName" 
else

将正则表达式翻译为详细的英语,此处的 sed 脚本将“输入行中第一次出现的 '_zz 后跟一个或多个数字,后跟文字句号'”替换为句号。

即像本的回答一样,它不会对包含两个或多个“_zz20...”序列的文件做正确的事情。很容易将其替换为 Birei 的正则表达式(除了去掉 \1 和 \2 之间的单词“null”,这会将其替换为文字字符串“null”):

NewFileName=$(echo "$FileToMove" | sed -E -e 's/^(.*)zz[0-9]+(\.pdf)$/\1\2/')

顺便说一句,这可以用一行来完成,并且不需要临时变量($NewFileName),但这种方式更容易理解。

答案2

如果我理解你的问题,你不想提取任何内容,只想zz20null.单程:

FolderNo=$(echo "$FileToMove" | sed -r -e 's/^(.*)zz[0-9]+(\.pdf)$/\1null\2/')

它在组 1 中保存匹配之前的所有字符,zz20并在组 2 中保存匹配之后的所有字符。唯一未保存的字符将zz20丢失并替换为null

答案3

如果您打算替换为 null 的概念,而不是文本“null”,您可以使用以下命令:

$ FolderNo=$(sed 's/_zz20//' <<< "2012-09-01 Home insurance quote_zz20.pdf")
$ echo $FolderNo
2012-09-01 Home insurance quote.pdf

这会将第一次出现的 替换_zz20为空。这是因为 sed 参数的第二部分为空 ( s/search/replace/=> s/_zz20//)。

我的例子并不像你引用的例子和@Birei 建议的例子那么仔细。如果您的任何文件有多个“_zz20”字符串,则结果不会很好。

答案4

使用珀尔的rename:

rename -n 's/.*zz([0-9]+)\.pdf/$1/' ./*

当输出看起来令人满意时删除-n(又名)。dry-run

相关内容