使用 sed 从列中提取多个数据

使用 sed 从列中提取多个数据

我有一个包含这样信息的文件

Info A: 1
Info B: 2
Info C: 3
Info D: 4

Info A: 1
Info B: 2
Info C: 123
Info D: 4

现在我正在尝试使用 Info C 获取线路,但我需要单独使用它。我需要一个命令来获取第一个块的 Info C 的输出,以及一个命令来获取第二个块的 Info C 的输出。这个命令对我有用,可以获取两个块的信息 C。在命令的第一部分中,我将删除除包含 Info C 的行之外的所有内容。在命令的第二部分中,我将删除字符串“Info C:”

cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //'

输出仅包含值:

3
123

现在,为了单独获得它,我尝试了 sed 的几个参数,但对我来说没有任何作用。

以下解决方案对我来说效果很好。我只打印第一行或最后一行

cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '$p'
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p'

但我想知道,是否有一个没有 sed 第二条管道的解决方案?

答案1

好吧,如果你的 shell 支持数组,你可以这样做:

$ infoC=( $(sed -n 's/Info C: \(.*\)/\1/p' file ) )
$ echo ${infoC[0]}
3
$ echo ${infoC[1]}
123

或者,使用 GNU sed

infoC=($(sed -rn 's/Info C: (.*)/\1/p' file ))

sed在这里使用一个更简单的命令。它-n会抑制正常输出,因此它只打印您告诉它的行。替换运算符与带有Info C:and 的行相匹配捕获(带括号)保存为 的值\1。因此它将替换该行\1并打印它(p最后的)。

这是一种将 的输出保存在数组中var=( $(command) )的方法。第一个元素是 then ,第二个元素是,等等。这里,数组名称是。commandvar${var[0]}${var[1]}infoC

答案2

cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p;$p'

相关内容