我想要的是:该文件包含:
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
.....
如何使用 sed 或其他工具获取字符串的值?
我尝试:
sed -n '/^VAR_3|*/,/^[A-Z_]+/{;p}'
感谢您的帮助。
答案1
假设您的输入保存在名为“test.txt”的文件中,您可以使用“awk”并遵循以下语法:
awk -F '|' '/^VAR_3/ {print $2}' test.txt
根据您给出的输入执行示例:
$ awk -F '|' '/^VAR_3/ {print $2}' test.txt
VALU_31
以下是这个 awk 命令的基本解释:
-F '|'
:将“|”(管道符号)定义为字段分隔符
/^VAR_3/
:仅匹配以“VAR_3”开头的行
{print $2}
:打印第二个字段/列(在本例中,包含要打印的值)
更新(2015 年 12 月 3 日):
因此,OP 添加了一条澄清的评论,这导致得出结论,他希望搜索是多行的,并将两个“标记”之间的行视为第一个标记的值的一部分。
这是最初示例的修订版本,这次使用“sed“ (2次!)和“头“命令:
$ 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
很好。所以它也适用于单行的情况!
如果搜索的字符串不在输入中,它还能正常工作吗?让我们尝试一下VAR_0
(给定示例中不存在):
$ sed -n '/VAR_0|/,/VAR_/p' test.txt | sed '1 s/VAR_0|//' | head -n -1
$
太棒了。所以这似乎在很多情况下都有效(尽管我猜可能还有更有效的解决方案)。
那么,这是如何工作的呢?以下是“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|
第一行中的“ ” - 和 - 最后一行。
因此,我们将这个第一个输出通过管道传输到另一个仅适用于第一行的“sed”指令,并且将字符串“ 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”)开关-特别是“ -n 1
”来排除最后一行:
$ sed -n '/VAR_3|/,/VAR_/p' test.txt | sed '1 s/VAR_3|//' | head -n -1
VALU_31
VALU_31
VALU_33
答案2
太棒了。我想用“sed -n '/VAR_3|/,/变量/p' test.txt | sed '1 s/VAR_3|//' | head -n -1" 类似这样的命令:sed -n "/$SEEK|/,/^[A-Z_-]+\|/p" get-server-infos.txt | sed "1 s/$SEEK|//" | head -n -1
我的 VARS 名称总是格式如下“^[A-Z_-]+|*”
以大写字母开头,可以包含“-”和“_”,并且始终包含“|”。
非常感谢您的帮助。