【问题标题】:How do I count the number of lines in a bash variable, respecting emptiness?如何计算 bash 变量中的行数,尊重空虚?
【发布时间】:2020-03-31 15:28:22
【问题描述】:

我们知道how to count the number of lines in a variable。然而,正如 cmets 和那里的答案所指出的,当涉及到空变量时,语义是古怪的,因为空变量通常被视为与非空、无换行符变量相同:

$ echo -n "" | wc -l
0
$ echo -n "foo" | wc -l
0
$ echo "" | wc -l
1
$ echo "foo" | wc -l
1

不太好,如果你想计算其他命令返回的结果数。

现在,在该问题的其中一个答案中建议了部分解决方法:

printf "%s" "$a" | grep -c "^"

但这也不完全是我所追求的,因为它会将值为换行符的非空变量计为 0 行。

我的问题:除了“定期”计数然后明确检查是否为空的情况外,是否有一种体面的方法可以在 bash 中获得这样的计数?

【问题讨论】:

  • “它将一个包含换行符的非空变量视为有 0 行”——是吗?这个printf "%s" $'x\n' | grep -c "^" 为我返回1
  • @BenjaminW.:我的意思是只保留一个换行符。
  • 你想计算第一行之后的空行吗? printf "a\n\n\n\nb\n" | countcommand 和不以换行符结尾的数据应该是什么结果:printf "a\nb"printf "a\n"
  • @WalterA:假设它是某个 shell 实用程序产生了该输出。那些通常用换行符来结束事情,以便提示在线开始。所以,我认为a\n\n\n\nb\n 应该给 5;最后一个空行,没有\n,将不被计算在内。 a\nb - 两行,但这是我不太可能得到的输入。 a\n - 一行。另请参阅编辑。

标签: string bash is-empty line-count


【解决方案1】:

awk 救援:

$ echo -n "foo" | awk 'END {print NR}'
1
$ echo -n "" | awk 'END {print NR}'
0

【讨论】:

  • 看起来是最强大的解决方案,即使 awk 有点像大锤子。
【解决方案2】:

下面会统计换行数:

printf %s "$var" | tr -d -c '\n' | wc -c

它适用于所有情况,除非最后一行缺少换行符。


如果变量为空,您可以像这样单独测试:

test -z "$var" && echo "var is empty"

test -n "$var" && echo "var is not empty"

【讨论】:

    猜你喜欢
    • 2011-09-12
    • 2013-03-13
    • 2023-03-07
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2012-01-31
    相关资源
    最近更新 更多