如何在sed或awk中搜索点a数字,并在数字前面加上前导零?

如何在sed或awk中搜索点a数字,并在数字前面加上前导零?,awk,sed,freebsd,Awk,Sed,Freebsd,我正在尝试修改大量文件的名称,所有文件的结构如下: 4.A.1 Introduction to foo.txt 2.C.3 Lectures on bar.pdf 3.D.6 Processes on baz.mp4 5.A.8 History of foo.txt 我想在最后一位加一个前导零: 4.A.01 Introduction to foo.txt 2.C.03 Lectures on bar.pdf 3.D.06 Processes on baz.mp4 5.A.08 History

我正在尝试修改大量文件的名称,所有文件的结构如下:

4.A.1 Introduction to foo.txt
2.C.3 Lectures on bar.pdf
3.D.6 Processes on baz.mp4
5.A.8 History of foo.txt
我想在最后一位加一个前导零:

4.A.01 Introduction to foo.txt
2.C.03 Lectures on bar.pdf
3.D.06 Processes on baz.mp4
5.A.08 History of foo.txt
首先,我尝试使用
sed
(FreeBSD实现)获取新名称:

但是我在


注意:更换第二个圆点也可以。我也愿意使用
awk

此管道应该适合您:

ls | sed 's/\.\([0-9]\)/.0\1/'
此处的
sed
命令将捕获该数字并将其替换为前面的
0


此处,
\1
引用了第一个(仅在本例中)捕获组-括号中的表达式。

此管道应适用于您:

ls | sed 's/\.\([0-9]\)/.0\1/'
此处的
sed
命令将捕获该数字并将其替换为前面的
0


在这里,
\1
引用了第一个(仅在本例中)捕获组-括号中的表达式。

虽然它在这里可能对您有用,但一般来说,无论是使用
sed
还是
awk
还是其他任何方法。幸运的是,使用globbing和:

[[:digit:].[:alpha:].[:digit:]\?*;做 #如果没有匹配的文件,$f=“[:digit:].[:alpha:].[:digit:]]?*”。 如果[“$f”!=”[[:数字:].[:阿尔法:].[:数字:].*”;然后 tail=${f#*..}#文件名无“1.A.”前缀 head=${f%“$tail”}#前缀为“1.A.” mv“$f”“${head}0${tail}” fi 完成
(编辑:筛选出与所需格式不匹配的文件名。)

虽然它在这里可能对您有用,但通常情况下,无论是使用
sed
还是
awk
还是其他任何方法。幸运的是,使用globbing和:

[[:digit:].[:alpha:].[:digit:]\?*;做 #如果没有匹配的文件,$f=“[:digit:].[:alpha:].[:digit:]]?*”。 如果[“$f”!=”[[:数字:].[:阿尔法:].[:数字:].*”;然后 tail=${f#*..}#文件名无“1.A.”前缀 head=${f%“$tail”}#前缀为“1.A.” mv“$f”“${head}0${tail}” fi 完成
(编辑:筛选出与所需格式不匹配的文件名。)

如果它对其他人有帮助,作为@costaparas答案的替代方法:

ls | sed -E -e 's/^([0-9][.][A-Z][.])/\10/' > files
然后,要创建脚本文件,请执行以下操作:

cat files | awk '{printf "mv \"%s\" \"%s\"\n", $0, $0}' | sed 's/\.0/\./' > movefiles.sh

如果它有助于其他人,作为@costaparas的替代方案,请回答:

ls | sed -E -e 's/^([0-9][.][A-Z][.])/\10/' > files
然后,要创建脚本文件,请执行以下操作:

cat files | awk '{printf "mv \"%s\" \"%s\"\n", $0, $0}' | sed 's/\.0/\./' > movefiles.sh
我也愿意使用awk

file.txt
内容为:

4.A.1 Introduction to foo.txt
2.C.3 Lectures on bar.pdf
3.D.6 Processes on baz.mp4
5.A.8 History of foo.txt
然后

输出

4.A.01 Introduction to foo.txt
2.C.03 Lectures on bar.pdf
3.D.06 Processes on baz.mp4
5.A.08 History of foo.txt
说明:我将点(
)设置为字段分隔符和输出字段分隔符,然后通过连接0和所述列,将每行的前导0添加到第三列(
$3
)。最后我
打印
这样修改过的行

(在GNU Awk 5.0.1中测试)

我也愿意使用Awk

file.txt
内容为:

4.A.1 Introduction to foo.txt
2.C.3 Lectures on bar.pdf
3.D.6 Processes on baz.mp4
5.A.8 History of foo.txt
然后

输出

4.A.01 Introduction to foo.txt
2.C.03 Lectures on bar.pdf
3.D.06 Processes on baz.mp4
5.A.08 History of foo.txt
说明:我将点(
)设置为字段分隔符和输出字段分隔符,然后通过连接0和所述列,将每行的前导0添加到第三列(
$3
)。最后我
打印
这样修改过的行

(在GNU Awk 5.0.1中测试)

这可能适合您(GNU sed):

这将在每行的第一个非空字符字符串的最后一个
后追加
0

这可能适用于您(GNU-sed):


这将在每行的第一个非空字符字符串中的最后一个
后追加
0

这更简洁,我最终采用了我在贡献的答案中分享的方式(对我来说,它更安全、更容易阅读,可能缺乏
sh
的经验).BTW如果目录中有其他文件不遵循该模式,则解决方案会将其前缀为零。但是知道
sh
可以做到这一点仍然是非常有效的信息。@M.E.观点不错;我已经编辑了解决方案以过滤掉不需要的文件名。这更简洁,我最终按照我在贡献的答案中分享的方式进行了操作(对我来说,这更安全、更容易阅读,可能缺乏使用
sh
)的经验)。顺便说一句,如果目录中有其他文件不遵循该模式,则解决方案会将它们前缀为零。但是知道
sh
可以做到这一点仍然是非常有效的信息。@M.E.观点不错;我已编辑解决方案以过滤掉不需要的文件名。