使用';sed';或';awk&x27;

使用';sed';或';awk&x27;,awk,sed,Awk,Sed,我有一个包含此格式日期的文件(每隔几天更改一次) 我需要的是在月/日中添加一个零,使其在个位数的月和日中看起来像这样 01/05/2016 我在网上发现了一个“sed”命令,但是它只在“/”之间的数字上加了一个零,而不是第一个数字。有什么建议吗 这是命令: sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg' /path/to/your/file 就你做错了什么而言,你的第一个sed节只会在前面有一个非数字字符的日

我有一个包含此格式日期的文件(每隔几天更改一次)

我需要的是在月/日中添加一个零,使其在个位数的月和日中看起来像这样

01/05/2016
我在网上发现了一个“sed”命令,但是它只在“/”之间的数字上加了一个零,而不是第一个数字。有什么建议吗

这是命令:

sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg' /path/to/your/file

就你做错了什么而言,你的第一个
sed
节只会在前面有一个非数字字符的日期起作用。这意味着它不会在行首的日期运行,因为它前面没有字符

见以下发言稿:

pax$ echo "1/1/2001 1/1/2001" | sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg'
1/01/2001 01/01/2001

pax$ echo "_1/1/2001 1/1/2001" | sed -e 'sx\([^0-9]\)\([0-9]/\)x\10\2xg' -e 'sx/\([0-9]/\)x/0\1xg'
_01/01/2001 01/01/2001
您可以看到,第一个日期在第一个命令中没有正确更改,但在第二个命令中更改了,因为它前面有一个字符

对此的一个快速修复方法是简单地添加另一个子句来处理该行开头的情况:

-e 'sx^\([0-9]/\)x0\1xg'
如果您的
sed
支持扩展正则表达式,您还可以切换到扩展正则表达式,并修改第一节以处理这两种情况(非数字或起始锚点):

这也让你摆脱了一些丑陋的反斜杠:-)

当然,如果您的所有日期都在行的开头,或者您在一行文件中的行的开头有一个日期(您的第一段似乎暗示了这一点),那么它会变得简单得多:


这似乎奏效了。因为在第一个数字之前我什么都没有,所以我大概能找到一个正确的方法
sed-e'sx\([^0-9]\)\([0-9]/\)x\10\2xg'-e'sx^\([0-9]/\)x0\1xg'
谢谢。你的-r选项成功了!(我确实需要使用/usr/xpg4/bin/sed才能工作)就个人而言,使用date转换日期格式会让我感觉更舒服。示例:
echo“1/5/2016”| awk'{system(“date-d“$1”+%d/%m/%Y”)}
-e 'sx^\([0-9]/\)x0\1xg'
pax$ echo "1/1/2001 1/1/2001" | sed -r -e 'sx([^0-9]|^)([0-9]/)x\10\2xg' -e 'sx/([0-9]/)x/0\1xg'
01/01/2001 01/01/2001
pax$ echo "1/1/2001" | awk -F/ '{printf "%02d/%02d/%04d\n", $1, $2, $3}'
01/01/2001