Bash:使用“find”的结果作为不同 Bash 函数的参数

Bash:使用“find”的结果作为不同 Bash 函数的参数

我有一个简短的 shell 脚本,可以从目录中获取鸡肉信息chickens。这是我的三个 .txt 文件:

~\Desktop\Chickens (或子目录)

++++++++ yoke-o-ono.txt ++++++++
NAME: Yoke-o-ono
TYPE: Hen
COLOR: White

++++++++ zelda.txt ++++++++
NAME: Zelda
TYPE: Hen

++++++++ fido.txt ++++++++
NAME: Some Dog named Fido (WTF Fido?)
COLOR: Black

有许多可选属性,但我关心的是名称、类型和颜色。我想以以下格式将所有鸡打印到控制台:“[姓名][类型]-[颜色]“(如果字段不存在则打印空白)。

formatEcho () {
      echo "[$1] [$2]-[$3]"
}

getChickens () {
  find ~/Desktop/Chickens -name "*.txt" |
  xargs grep -h -e "NAME" -e "TYPE" -e "COLOR" |
  sed -E 's/^[A-Z].*:(.*$)/\1/g' |
  sed -E 's/^[A-Z].*:(.*$)/\1/g' |
  sed -E 's/^[A-Z].*:(.*$)/\1/g'
}

formatEcho $(getChickens)

然而,正如预期的那样,这只输出一只鸡。

[Yoke-o-ono] [Hen]-[White]

我可以使用一些帮助将 formatEcho 集成到 getChickens 方法中,以便显示每只鸡:

[Yoke-o-ono] [Hen]-[White]
[Some dog named Fido (WTF Fido?)] []-[Black]
[Zelda] [Hen]-[]

例如,使用的结果find作为的参数formatEcho

编辑(尝试斯科特的答案)

bash-5.1$ sh script.sh 
script.sh: line 21: shopt: globstar: invalid shell option name
awk: can't open file /Users/MYNAME/Desktop/Chickens/**/*.txt
 source line number 14

脚本.sh:

shopt -s globstar
awk '
function formatEcho(na, ty, col) {
                        print "[" na "] [" ty "]-[" col "]"
                }
    FNR==1      {
                  if (NR != 1) formatEcho(name, type, color)
                  name=""; type=""; color="";
                }
                { data = $0; sub($1 " ", "", data) }
$1=="NAME:"     { name = data }
$1=="TYPE:"     { type = data }
$1=="COLOR:"    { color = data }
END             { formatEcho(name, type, color) }
    ' ~/Desktop/Chickens/**/*.txt

答案1

你可以在 awk 中做到这一点,狂欢

shopt -s globstar
awk '
function formatEcho(na, ty, col) {
                        print "[" na "] [" ty "]-[" col "]"
                }
    FNR==1      {
                  if (NR != 1) formatEcho(name, type, color)
                  name=""; type=""; color="";
                }
                { data = $0; sub($1 " ", "", data) }
$1=="NAME:"     { name = data }
$1=="TYPE:"     { type = data }
$1=="COLOR:"    { color = data }
END             { formatEcho(name, type, color) }
    ' ~/Desktop/Chickens/**/*.txt

这些data = $0; sub($1 " ", "", data)语句将数据放在标签的右侧。这不是一种完美的方法,但它可以用于您在问题中显示的数据。

使用globstarshell 选项狂欢 **将进行子目录搜索。


您的问题已加标签,而且你在标题中两次提到“bash”,在评论中也多次提到。而且  在我的回答中两次提到“bash”,在评论中又多次提到。所以我认为这肯定是在 bash 中运行的。  Cyrus 的评论建议您至少使用 4.0 版的 bash。但这可能还不够。

所以,这必须在 bash 中运行。

  • 如果你以笨拙的方式运行脚本,你必须说bash script.sh。如果你说sh script.sh,你正在运行默认 shell ( /bin/sh),它可能符合 POSIX 标准,但可能不是 bash(它可能是 Bourne shell)— 请参阅评论以了解讨论。
  • 如果你将它作为可执行脚本运行(执行chmod +x然后以 运行./script.sh),则必须以“shebang”开头
    #!/bin/bash
    
    或者
    #!/usr/bin/env bash
    
    这必须是脚本的第一行。

相关内容