shell进程子串

shell进程子串

我知道我可以用 替换子字符串sed并将命令评估与 集成$(...)。但是如果我想根据要替换的字符串计算替换值怎么办?

例子

我有一个来自 stat 的格式化字符串:

❯ stat --format '%A size %s, birth %.10w mod %.10y' Ambient/The\ XX\ -\ Intro.mp3
-rw-r--r-- size 5126226B, birth 2021-12-05 mod 2021-11-15

现在我想让尺寸变得人类可读。我当然可以使用 stat 或中间变量的另一个调用:

❯ stat --format '%A size |, birth %.10w mod %.10y' Ambient/The\ XX\ -\ Intro.mp3 | sed "s/|/$(stat --format "%s" Ambient/The\ XX\ -\ Intro.mp3 | numfmt --to=iec)/"
-rw-r--r-- size 4,9M, birth 2021-12-05 mod 2021-11-15

本质

有没有办法在管道内处理此处理,也许通过awk或使用cut并将它们合并在一起?

答案1

如果您避免在大小后面插入B(stat在 Ubuntu 上不会自动插入此字符,所以我不确定它来自哪里) 和逗号,您可以通过管道传输statto的输出numfmt并让它转换其输入中的第三个字段:

$ stat --format '%A size %s birth %.10w mod %.10y' box.ova
-rw------- size 17098132480 birth - mod 2021-12-06
$ stat --format '%A size %s birth %.10w mod %.10y' box.ova | numfmt --to=si --field=3
-rw------- size         18G birth - mod 2021-12-06

使用以下命令挤压多个连续空格tr

$ stat --format '%A size %s birth %.10w mod %.10y' box.ova | numfmt --to=si --field=3 | tr -s ' '
-rw------- size 18G birth - mod 2021-12-06

相关内容