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

如何使用 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
.....

如何使用 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_-]+|*”
以大写字母开头,可以包含“-”和“_”,并且始终包含“|”。

非常感谢您的帮助。

相关内容