我有一组文件,我想在其中放置${today+N}之类的东西,并将它们替换为‘YYYY DD’。例如,如果我看到"some:${today+5},我希望这个结果是"some :2019-11-27“。
我以为我能做到
echo "my test: \${today+54}"| gsed -e "s/\${today+\([0-9]*\)}/$(date -v +\1d '+%Y-%m-%d')/g"
这就像date -v +1d,不做我想做的事情,也就是date -v +54d。
regex不是问题--反向引用可以按我的要求工作,如:echo "mat test \${today+54}"| gsed -e "s/\${today+\([0-9]*\)}/\1/g"所示
如何将反向引用传递给子命令?
发布于 2019-11-23 14:54:19
下面有一种方法可以使用GNU awk来匹配第3 arg ():
$ cat tst.awk
{
while ( match($0,/(.*)\${([^}]+)([+-][0-9]+)}(.*)/,a) ) {
cmd = "date -d \047" a[2] " " a[3] " days\047 +\047%F\047"
newDate = ( (cmd | getline line) > 0 ? line : "N/A" )
$0 = a[1] newDate a[4]
}
print
}
$ cat file
some date: ${today+5}, some other date: ${yesterday-30}
$ awk -f tst.awk file
some date: 2019-11-28, some other date: 2019-10-23我有GNU,它没有-v选项,所以只需按摩date命令字符串,以适应您的系统。
很容易对任何awk工作进行调整,或者取决于您希望输入文件中的日期命令看起来像是可以消除对date的调用和调用gawk时间函数,以获得更快的执行速度。还有很多其他方法可以让您在这些数据命令所包含的内容上具有更大的灵活性,但是只要输入的一个示例,就不值得尝试猜测您还想要做什么。
发布于 2019-11-22 16:25:10
您可以使用GNU的e命令来完成这一任务:
echo "my test: \${today+54}" \
| gsed -e "s/\${today+\([0-9]*\)}/\$(date -v '+\1d' '+%Y-%m-%d')/g;s/.*/echo &/;e"首先,用子进程命令替换令牌的所有匹配:
echo "my test: \${today+54}" \
| gsed -e "s/\${today+\([0-9]*\)}/\$(date -v '+\1d' '+%Y-%m-%d')/g"
my test: $(date -v '+54d' '+%Y-%m-%d')然后,将一个echo放在前面,并通过e命令运行它。
但是,根据消息的其余部分,您可能会遇到将内容作为shell命令处理的问题。
更多信息:https://www.gnu.org/software/sed/manual/sed.html#Extended-Commands
https://stackoverflow.com/questions/58997690
复制相似问题