我想对此:文件箱:
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很多为您的帮助。