Linux下如何为文件每行的数字前缀补前导零?
Linux下为每行数字补前导零的简便实现方法
原始文件内容:
1:line1 14:line2 135:line3 15:line4
需要将每行开头的数字补前导零,变成5位格式,期望输出:
00001:line1 00014:line2 00135:line3 00015:line4
你之前用的命令之所以出错,是因为FNR取的是当前行的行号,而不是每行开头的原始数字,所以才会把行号补零后拼接整行内容,导致出现重复的冒号和原始数字。
给你几个简便的正确实现方法:
方法一:awk分割字段处理
这是最直观的方式,用冒号作为分隔符拆分每行内容:
awk -F: '{printf "%05d:%s\n", $1, $2}' file
-F::指定每行的分隔符为冒号,这样$1就是开头的数字部分,$2是后面的文本%05d:把$1格式化为5位数字,不足的地方补前导零- 最后拼接冒号和
$2输出即可
方法二:sed结合printf替换
如果习惯用sed,可以用它的命令执行功能来格式化数字:
sed 's/^[0-9]\+/printf "%05d" &/e' file
^[0-9]\+:匹配行首的一串数字printf "%05d" &:把匹配到的数字(&代表匹配内容)用printf格式化成5位带前导零的数字e:让sed执行替换后的命令,把结果替换回原位置
方法三:Perl一行命令
Perl的正则替换同样可以快速实现:
perl -pe 's/^\d+/sprintf("%05d", $&)/e' file
^\d+:匹配行首的数字串sprintf("%05d", $&):将匹配到的数字格式化为5位带前导零的形式-pe:循环处理每行,替换后输出
内容的提问来源于stack exchange,提问作者Monkey05connor
相关产品推荐
相关产品推荐

