首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sed、backreference和子命令查找和替换日期令牌?

如何使用sed、backreference和子命令查找和替换日期令牌?
EN

Stack Overflow用户
提问于 2019-11-22 15:54:14
回答 2查看 254关注 0票数 1

我有一组文件,我想在其中放置${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"所示

如何将反向引用传递给子命令?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-23 14:54:19

下面有一种方法可以使用GNU awk来匹配第3 arg ():

代码语言:javascript
复制
$ 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时间函数,以获得更快的执行速度。还有很多其他方法可以让您在这些数据命令所包含的内容上具有更大的灵活性,但是只要输入的一个示例,就不值得尝试猜测您还想要做什么。

票数 2
EN

Stack Overflow用户

发布于 2019-11-22 16:25:10

您可以使用GNU的e命令来完成这一任务:

代码语言:javascript
复制
echo "my test: \${today+54}" \
    | gsed -e "s/\${today+\([0-9]*\)}/\$(date -v '+\1d' '+%Y-%m-%d')/g;s/.*/echo &/;e"

首先,用子进程命令替换令牌的所有匹配:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58997690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档