gpt4 book ai didi

perl - 如何用 sed、awk 等的 shell 命令的输出替换子字符串?

转载 作者:行者123 更新时间:2023-12-03 23:25:03 25 4
gpt4 key购买 nike

我想使用 sed 或任何命令行工具通过 shell 命令的输出替换部分行。例如:

  • 通过调用 date
  • 将 linux 纪元替换为人类可读的时间戳
  • 通过调用内部解码器
  • ,将特定协议(protocol)数据包的六进制转储替换为已解码的对应数据包
    sed 似乎最合适,因为它也允许匹配模式并重新格式化其他内容,例如移动匹配位,但不是强制性的。

    这是一个简化的示例:
    echo "timestamp = 1234567890" | sed "s/timestamp = \(.*\)/timestamp = $(date -u --d @\1 "+%Y-%m-%d %T")/g"

    当然, $(...) 这个东西是行不通的。据我了解,这是针对环境变量的。

    那么正确的语法是什么?在这种情况下推荐使用 sed 吗?我花了几个小时搜索...... sed 甚至能够做到这一点吗?还有其他更适合的工具吗?

    编辑

    我需要...
  • 模式匹配。日志中充满了其他内容,因此我需要能够根据上下文(之前和之后的文本,在同一行上)确定要替换的字符串。这不包括基于列位置的匹配,如 awk '{$3 ...
  • 就地替换,因此行的其余部分“Timestamp =”或其他内容保持不变。这排除了 sed 的 'e' 命令。
  • 最佳答案

    要在 sed 中运行外部命令,您需要使用 e 。看一个例子:

    $ echo "timestamp = 1234567890" | sed "s#timestamp = \(.*\)#date -u --d @\1 "\+\%Y"#e"
    2009

    使用完整格式:
    $ sed "s#timestamp = \(.*\)#echo timestamp; date -u --d @\1 '\+\%Y-\%m-\%d \%T'#e" <<< "timestamp = 1234567890"
    timestamp
    2009-02-13 23:31:30

    这会捕获时间戳并将其转换为 +%Y 格式。

    man sed :

    e

    This command allows one to pipe input from a shell command into pattern space. If a substitution was made, the command that is found in pattern space is executed and pattern space is replaced with its output. A trailing newline is suppressed; results are undefined if the command to be executed contains a nul character. This is a GNU sed extension.



    但是,您会看到它有点“丑陋”。根据您想要做什么,您最好使用常规的 while 循环来获取值,然后正常使用 date。例如,如果文件是这样的:
    timestamp = 1234567890

    然后你可以说:
    while IFS="=" read -r a b
    do
    echo "$b"
    done < file

    这将使您拥有 $b 作为时间戳,然后您可以执行 date ...

    关于perl - 如何用 sed、awk 等的 shell 命令的输出替换子字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27823959/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com