这是由贡献者创建的 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
如果我理解你的问题,你不想提取任何内容,只想zz20
用null
.单程:
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”字符串,则结果不会很好。