如何使用sed获取文件中var的值

我想对此:文件箱:

VAR_1|VALU_1 VAR_2|VALU_2 VAR_3|VALU_31 VALU_31 VALU_33 VAR_4|VALU_4 VAR_5|VALU_5 VAR_6|VALU_61 VALU_62 VAR_7|VALU_7 ..... 

我怎样才能得到一个string的值与sed或其他?

我尝试:

 sed -n '/^VAR_3|*/,/^[A-Z_]+/{;p}' 

谢谢你的帮助。

想象你的input被保存在一个名为“test.txt”的文件中,你可以用下面的语法来使用“awk”:

awk -F '|' '/^VAR_3/ {print $2}' test.txt

您input的样本执行:

 $ awk -F '|' '/^VAR_3/ {print $2}' test.txt VALU_31 

下面是这个awk命令的基本解释:

-F '|' :定义“|” (pipe道符号)作为字段分隔符
/^VAR_3/ :只匹配以“VAR_3”开头的行
{print $2} :打印第二个字段/列(在这种情况下,它包含您要打印的值)

更新(2015年12月3日):

因此,OP增加了一个澄清的评论,从而得出结论,他希望search是多行的,考虑两个“代币”之间的界限作为第一个代币的价值的一部分。

下面是最初示例的修订版本,这次使用“ sed ”(2次!)和“ head ”命令:

 $ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1 VALU_31 VALU_31 VALU_33 

好。 这看起来不错🙂让我们看看是否适用于单行情况:

 $ sed -n '/VAR_4|/,/VAR_/p' test.txt | sed '1 s/VAR_4|//' | head -n -1 VALU_4 

好。 所以它也适用于单线情况!

如果search到的string不在input中,是否工作正常? 让我们尝试一下VAR_0 (在给定的例子中不存在):

 $ sed -n '/VAR_0|/,/VAR_/p' test.txt | sed '1 s/VAR_0|//' | head -n -1 $ 

大。 所以这似乎在几种情况下工作(虽然我猜可能有更有效的解决scheme)。

那么,这是如何工作的? 以下是“VAR_3”示例的基本说明…

第一部分 – sed -n '/VAR_3|/,/VAR_/p' test.txt – 返回以下输出:

 $ sed -n '/VAR_3|/,/VAR_/p' test.txt VAR_3|VALU_31 VALU_31 VALU_33 VAR_4|VALU_4 

所以,该部分基本上匹配VAR_3和下一个VAR_发生之间的所有内容。 正如我们所看到的,这部分似乎正在返回我们想要的东西…… VAR_3|两件我们不想要的东西:第一行中的“ VAR_3| ”和最后一行。

所以,我们把这个第一个输出传给另外一个只适用于第一行的“sed”指令,我们把string“ VAR_3| ”replace成VAR_3| ,有效的删除它:

 $ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' VALU_31 VALU_31 VALU_33 VAR_4|VALU_4 

1 ”用于将sed命令应用于第一行…并且我们不想包含最后一行,所以我们用“ -n ”(“MINUS n”)将输出传送给“ head ”命令开关 – 特别是“ -n 1 ”排除最后一行:

 $ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1 VALU_31 VALU_31 VALU_33 

那很棒。 我想通过这样的方法replace“sed -n”/ VAR_3 | /,/ VAR_ / p'test.txt | sed'1 s / VAR_3 | //'| head -n -1“中的”VAR_“ sed -n“/ $ SEEK | /,/ ^ [A-Z _-] + \ | / p”get-server-infos.txt | sed“1 s / $ SEEK | //”| 头-n-1

我的VARS名称总是像这样形成的“^ [A-Z _-] + | *”
以大写字母开头,可以包含“ – ”和“_”,并且总是包含“|”。

Thx很多为您的帮助。