【问题标题】:change the separator of a paste commande更改粘贴命令的分隔符
【发布时间】:2022-07-13 21:29:49
【问题描述】:

我在解析命令的结果时遇到问题:

find / -type f -not \( -path '/dev/*' -or -path '/proc/*' -or -path '/sys/devices/*' \) -print0 |
  xargs -0 bash -c 'paste -d " " <(md5sum "$@") <(sha1sum "$@") <(sha256sum "$@") <(du -lh "$@")' bash

给我这个:

c37967f401d16fa37736cbe08809d3d66c8f516a /etc/vmware-tools/resume-vm-default 1aae06b3e3db93584b27ddf24ecd58e7a080f33c160f0186ec9b50ab32bc9a92 /etc/vmware- tools/resume-vm-default 4.0K /etc/update-manager/release-upgrades

但我不希望用空格分隔它们,因为文件名中出现空格,因此无法解析它们。

我怎样才能得到这样的东西: c37967f401d16fa37736cbe08809d3d66c8f516a; /etc/vmware-tools/resume-vm-default ; 1aae06b3e3db93584b27ddf24ecd58e7a080f33c160f0186ec9b50ab32bc9a92; /etc/vmware- 工具/简历-vm-default; 4.0K; /etc/update-manager/release-upgrades;

我不知道如何更改我的值之间的分隔符。

【问题讨论】:

  • paste 通常有几个输入文件并将它们组合起来。您只输入paste 标准输入。不知道你想在这里实现什么。
  • 什么能让我的问题更清楚?
  • 专注于粘贴命令本身。 findxargs 似乎与您的问题无关。如果我理解正确,您在标准输入中有大量行,并且您想将这些行组合成一行,其中原始标准输入行现在用分号分隔。对吗?
  • 啊,我的错。由于工艺替代。您确实有多个输入。在这种情况下,为什么不简单地使用-d';' onpaste
  • paste -d ';' 怎么样?然后记录中的第一个单词是哈希或大小,其余的是文件名。

标签: bash find paste xargs


【解决方案1】:

首先,您可以使用paste -d';' 用半列而不是空格分隔您的记录。接下来,您可以对输出进行后处理,以将第一个空格字符串(制表符...)替换为另一个半列。以 GNU awk 为例:

$ echo foo > foo
$ echo bar > bar
$ paste -d ";" <(md5sum foo bar) <(sha1sum foo bar) \
  <(sha256sum foo bar) <(du -lh foo bar) | 
  awk -v RS=';|\n' '{sub(/[[:space:]]+/,";"); printf("%s%s", $0, RT)}'
d3b07384d113edec49eaa6238ad5ff00;foo;f1d2d2f924e986ac86fdf7b36c94bcdf32beec15;foo;b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c;foo;4.0K;foo
c157a79031e1c40f85931829bc5fc552;bar;e242ed3bffccdf271b7fbaf34ed72d089537b42f;bar;7d865e959b2466918c9863afca942d0fb89d7c9ac0c99bafc3749504ded97730;bar;4.0K;bar

【讨论】:

    猜你喜欢
    • 2022-11-25
    • 1970-01-01
    • 2012-02-29
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多