检查空白处的管道输入并转发它

检查空白处的管道输入并转发它

我想将一个命令的输出通过管道传输到另一个脚本。在另一个脚本中,我想检查输入是否为空或仅包含空格。如果是这样的话,我会忽略它。否则,我希望将所有输​​入转发到另外几个命令。

为了更清楚起见,我将运行类似的cat input.txt | ./script.sh命令input.txt

line 1
line 2
line 3

目前script.sh看起来像:

read input_text

if [ -z "$input_text" ]
    # ignore emtpy input
    then exit 0
else
    # do something here with the input
fi

问题是,在这种情况下,输入“第 1 行”的第一行被读入变量input_text,因此不会与输入的其余部分(仅由第 2 行和第 3 行组成)一起转发到后面的代码中else

所以,我如何首先检查输入是否不仅仅包含空格,然后转发整个输入到另一个命令?

答案1

这意味着您希望在看到非空白字符时立即转发输入。

awk -v cmd='otherCommand' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'

例子:

$ printf '%b\n' ' ' '' '\t' | awk -v cmd='echo START; sed "s/.*/<&>/"' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'
$ printf '%b\n' ' ' '' '\t' something | awk -v cmd='echo START; sed "s/.*/<&>/"' '
  forward {print | cmd; next}
  {initial_output = initial_output $0 "\n"}
  NF {printf "%s", initial_output | cmd; forward = 1}'
START
< >
<>
<       >
<something>

答案2

#!/bin/sh
{   tee /dev/fd/3 <&4&:|
    grep -q '[^[:space:]]' &&
    cat - /dev/fd/4 <&3
}   3<<"" 4<&0 | another_few_commands

# cause i dont know how else to end this with a blank line

答案3

使用循环怎么样? (这将以任何空行或仅有空格的行结束)

#!/bin/sh
while read input_text; do
  [ -z "$input_text" ] && break
  # do something with the non-blank input
done
exit 0

相关内容