【问题标题】:Convert substring through command通过命令转换子字符串
【发布时间】:2020-11-12 01:16:40
【问题描述】:

基本上,如何进行字符串替换,其中被替换的字符串由外部命令转换?

例如,给定行5aaecdab287c90c50da70455de03fd1e ./2015/01/26/GOPR0083.MP4,如何将行的第二部分(./2015/01/26/GOPR0083.MP4)通过管道传递给命令xargs stat -c %.6Y,然后用结果替换它,以便我们最终得到5aaecdab287c90c50da70455de03fd1e 1422296624.010000

这可以通过脚本来完成,但是单行会很好。

【问题讨论】:

  • 是否总是有 2 个字段 - 用空格分隔?你的输入源是什么,也许是一个多行的文件?也需要xargs 和更少的stat 或者每个文件有1 个stat 是否可以?
  • @Milag 最终我想处理整个文件,每一行都采用上述格式。是的,它们由空格分隔。它应该是逐行统计。我想用时间戳替换文件名。
  • 第一个字段(哈希)也有固定长度。
  • 好的。很简单,示例脚本可以遵循。

标签: bash replace pipe substring


【解决方案1】:
#!/bin/bash

hashtime()
{
    while read longhex fname; do
        echo "$longhex $(stat -c %.6Y "$fname")"
    done
}

if [ $# -ne 1 ]; then
    echo Usage: ${0##*/} infile 1>&2
    exit 1
fi

hashtime < $1

exit 0

# one liner
awk 'BEGIN { args="stat -c %.6Y " } { printf "%s ", $1; cmd=args $2; system(cmd); }' infile

【讨论】:

  • 谢谢!它似乎工作。我希望有一个班轮,但似乎我必须使用脚本。如果您不介意,除非有人提出优雅的单行解决方案,否则我会将您的答案标记为已接受。
  • 好的。找到 gawk system() 并制作了一个衬里。
【解决方案2】:

使用 GNU sed 的单行程序,它将处理整个文件:

sed -E "s/([[:xdigit:]]+) +(.*)/stat -c '\1 %.6Y' '\2'/e" file

或者,使用普通的 bash

while read -r hash pathname; do stat -c "$hash %.6Y" "$pathname"; done < file

【讨论】:

  • sed 带有 e 标志。不错!
【解决方案3】:

通常使用 awk sed cut 重新格式化输入。例如:

line="5aaecdab287c90c50da70455de03fd1e ./2015/01/26/GOPR0083.MP4"
echo "$line" |
cut -d' ' -f2- | 
xargs stat -c %.6Y

【讨论】:

  • 谢谢。但是如何重新组合该行以包含 2 个字段?
  • 具体包含哪些字段?请发布您想要获得的输出。
  • 我在最初的帖子中发布了示例中的示例输入和示例输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 1970-01-01
相关资源
最近更新 更多