【问题标题】:How to process null-separated content at the shell如何在 shell 中处理空分隔的内容
【发布时间】:2016-02-25 00:18:49
【问题描述】:

在回答this question 之后,我现在想知道进一步处理find -print0 的空分隔输出的最佳方法。

以下命令将在 find 返回的前 10 个文件中搜索一个短语 - 也许我们不想一次搜索太多。

find . -maxdepth 1 | head -10 | xargs grep "Specific Phrase"

但是,如果文件名中有换行符或空格,这可能会成为一个挑战,因为它们会弄乱我们的 xargs 命令。

我如何编写以下内容以使其正常工作 - 我可以在 bash 中执行此操作,还是需要使用 awk 之类的工具在空值处分解此字符串?

find . -maxdepth 1 -print0 | head -10 | xargs -0 grep "Specific Phrase"

似乎我可以用来描述的其他词是如何将字段分隔符更改为空字符。

【问题讨论】:

  • 哪个外壳?这方面的设施在 bash 或 ksh 中比 POSIX sh 好得多。
  • 我意识到我不知道如何在任何 shell 中做到这一点。让我们说bash,因为它很常见。
  • 那是一种“领先的评论”,因为下面提供的 solution @CharlesDuffy 是在 bash 中实现的,但问题只提到了大多数 shell 外部的工具。我很想看到这个问题的 Charles 认可的与 shell 无关的答案,或者至少一个在 POSIX shell 中工作的答案。
  • 我也在下面发布了一个awk 答案,它不需要复杂的外壳机制。

标签: bash shell unix


【解决方案1】:

在 bash 中,您可以执行以下操作:

head0() {
  local item i=0
  while IFS= read -r -d '' item && (( ++i <= "$1" )); do
    printf '%s\0' "$item"
  done
}

find . -maxdepth 1 -print0 | head0 10 | xargs -0 grep "Specific Phrase"

这里的相关成语是IFS= read -r -d '' item 阅读,printf '%s\0' "$item" 写作。

详细解释read命令:

  • IFS= 防止从任何字符串的开头或结尾修剪空格
  • read -r 防止文字反斜杠被消耗或抑制。
  • -d '' 设置字符串 '' 的第一个字符——一个空的 NUL 分隔字符串,因此第一个字符为 NUL——作为终止读取的字符。

【讨论】:

    【解决方案2】:

    这是使用awk 的另一个可能选项,它作为答案to this question 的一部分提供,但也适用于此处。

    find . -maxdepth 1 -print0 \
        | awk 'NR<=10;NR>10{exit}' RS="\0" ORS="\0" \
        | xargs -0 grep "Specific Phrase"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-04
      • 2016-10-15
      • 1970-01-01
      • 2021-04-10
      相关资源
      最近更新 更多