0

我有一个文件列表:File_2011_1.txt, File_2011_2.txt, File_2011_3.txt... File_2011_100.txt; 我想将所有文件名中的 2011 更新为 2012。

以下不起作用:

for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/*2011*/*2012*/'`; echo ${FILES} ${NEWNAME}; done;

但这确实:

for FILES in `ls`; do NEWNAME=`echo ${FILES} | sed -e 's/File_2011*/File_2012*/'`; echo ${FILES} ${NEWNAME}; done;

那么,为什么在我要更改的文件名部分之前的通配符不起作用?

4

1 回答 1

5

因为 sed 不使用File willcard(就像在 bash 或 DOS 中一样),而是使用正则表达式(正则表达式)。

您可以这样做sed -e 's/2011/2012/'(默认情况下,sed 的“s”命令匹配字符串的一部分)。通配符*将以.*正则表达式语言编写。

sed 正则表达式的基本规则:

  • 插入符号 ( ^) 与行首匹配。
  • 美元符号 ( $) 匹配行尾。
  • 星号 ( *) 匹配零次或多次出现的前一个字符。
  • 点 ( .) 匹配任何字符。
  • [and]用于匹配字符集,例如与[a-c01]单个字符匹配:abc01
于 2012-05-02T11:25:07.470 回答