我有一个包含这样信息的文件
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 ,第二个元素是,等等。这里,数组名称是。command
var
${var[0]}
${var[1]}
infoC
答案2
cat test2 | sed -e '/Info C: /!d' -e 's/Info C: //' | sed -n '1p;$p'