如何从文件的“键=值”字符串中获取值?

给定一个文件,其内容具有以下格式:


// This is a comment

FOO = 1

BAR = 0

// Comments can be anywhere...

BAZ = 10 //...even here!

键始终固定在行的开头,但是' ='字符的两边可能有任意数量的空格。该值也可以尾随任意数量的空格。


编辑:值和/或其尾随空格也可以跟在注释后面。


如何使用bash脚本和/或awk或作为单线获取键的值sed?我希望能够执行以下操作:


MYVAL=$(<string manipulation to get value of "BAZ" from /tmp/foo.txt>)

到达


>echo $MYVAL

10

>

我在bash脚本编写方面非常糟糕;从来没有足够的流水线使用字符串操作工具套件来知道如何解决这个问题。我能得到的最远的是


> grep BAZ /tmp/foo.txt

BAZ = 10

而且真的不知道下一步该怎么做。


我确实搜索了SO,但是找不到一个前提完全相同的解决方案(特别是' ='的两边都存在可变数量的空格),并且类似问题的解决方案在我的前提下不起作用。


一只名叫tom的猫
浏览 224回答 2
2回答

蛊毒传说

一线解决方案sed:MYVAR=$(sed -nE 's/^BAZ\s*=\s*(\S*)$/\1/p' inputfile)如一条注释中所述,sed在以下情况下,此命令将不会产生预期的结果:BAZ = 10 // some comment ending with 0此处MYVAR将分配0而不是10。要解决此问题,可以将正则表达式更改为:MYVAR=$(sed -nE 's/^BAZ\s*=\s*([^\s\/]*).*/\1/p' inputfile)现在MYVAR是10根据需要。分解正则表达式:^BAZ\s*=\s*([^\s\/]*).*/\1^&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Match beginning of line&nbsp;BAZ&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Match BAZ&nbsp; &nbsp; \s*=\s*&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Match equal sign surrounded by zero or more spaces&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;([^\s\/]*)&nbsp; &nbsp; &nbsp; &nbsp;Capture in Group 1 any character that is not space or slash&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.*&nbsp; &nbsp; &nbsp;Match the rest of the text&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;/\1&nbsp; Replace matched text with text in Group 1
打开App,查看更多内容
随时随地看视频慕课网APP