为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

一只名叫tom的猫 2021-04-03 14:11:24
给定一个文件,其内容具有以下格式:// This is a commentFOO = 1BAR = 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 $MYVAL10>我在bash脚本编写方面非常糟糕;从来没有足够的流水线使用字符串操作工具套件来知道如何解决这个问题。我能得到的最远的是> grep BAZ /tmp/foo.txtBAZ = 10而且真的不知道下一步该怎么做。我确实搜索了SO,但是找不到一个前提完全相同的解决方案(特别是' ='的两边都存在可变数量的空格),并且类似问题的解决方案在我的前提下不起作用。
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

一线解决方案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

^                           Match beginning of line

 BAZ                        Match BAZ

    \s*=\s*                 Match equal sign surrounded by zero or more spaces

           ([^\s\/]*)       Capture in Group 1 any character that is not space or slash

                     .*     Match the rest of the text

                       /\1  Replace matched text with text in Group 1


查看完整回答
反对 回复 2021-04-16
  • 2 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信