【问题标题】:how can I echo/print specific lines from a bash variable如何从 bash 变量中回显/打印特定行
【发布时间】:2013-04-03 01:13:23
【问题描述】:

我正在尝试从多行 bash 变量中打印特定行。我发现了以下内容:

while read line; do echo LINE: "$line"; done <<< "$x"

其中 x 将是变量,但这只是打印出所有行而不是单个行(例如第 1 行)。我该如何调整它以打印出特定的行而不是所有行? (希望避免将变量写入文件)

【问题讨论】:

    标签: bash variables debian


    【解决方案1】:

    要打印第 N 行:

    sed -n ${N}p <<< "$x"
    

    或(更便携):

    sed -n ${N}p << EOF
    $x
    EOF
    

    echo "$x" | sed -n "$N"p
    

    echo "$x" | sed -n ${N}p
    

    或(针对特定情况 N==3)

    echo "$x" | sed -n 3p
    

    while read line; do echo LINE: "$line"; done <<< "$x" | sed -n ${N}p
    

    while read line; do echo LINE: "$line"; done << EOF | sed -n ${N}p
    $x
    EOF
    

    【讨论】:

    • 完美运行,谢谢!结束了 echo "$x" | sed -n "$N"p 选项
    【解决方案2】:

    你可以把它拆分成一个数组,比如:

    IFS=$'\n' lines=($x)
    

    然后您可以通过索引数组来访问任何行,例如:

    echo ${lines[1]}
    

    (当然,lines[0] 是“第 1 行”)。

    【讨论】:

    • 谢谢!前一阵子用数组做到了这一点,但不记得我为我的一生做了什么
    【解决方案3】:

    如果您出于某种原因不想使用数组,并且想在 bash 中执行此操作,而不是通过生成像 sed 这样的外部工具,您可以简单地计算行数:

    [ghoti@pc ~]$ x=$'one\ntwo\nthree\nfour\nfive\n'
    [ghoti@pc ~]$ n=3
    [ghoti@pc ~]$ for (( c=0; c<n; c++ )); do read line; done <<< "$x"
    [ghoti@pc ~]$ echo $line
    three
    [ghoti@pc ~]$ 
    

    或者少用一个变量:

    [ghoti@pc ~]$ n=2
    [ghoti@pc ~]$ for (( ; n>0; n-- )); do read line; done <<< "$x"
    [ghoti@pc ~]$ echo $line
    two
    

    这些方法使用有时称为“循环的三个表达式”的方法。这是一种在许多语言中都很常见的结构,从 bash 到 awk 到 perl 到 PHP 到 C(但不是 Python!)。了解它们将有助于您的编程。

    虽然......您可能不想使用 bash 来学习“真正的”编程。 :-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2016-01-14
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      相关资源
      最近更新 更多