9

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

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

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

4

3 回答 3

12

打印第 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
于 2013-04-03T01:14:38.340 回答
11

您可以将其拆分为一个数组,例如:

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

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

echo ${lines[1]}

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

于 2013-04-03T01:18:43.250 回答
2

如果您出于某种原因不想使用数组,并且想在 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 来学习“真正的”编程。:-)

于 2013-04-03T01:46:28.713 回答