【问题标题】:BASH shell use regex to get value from file into a parameterBASH shell 使用正则表达式从文件中获取值到参数中
【发布时间】:2012-11-12 02:11:52
【问题描述】:

我有一个文件,我需要使用正则表达式获取一段文本。我们将文件命名为x.txt。我想做的是打开x.txt,从文件中提取正则表达式匹配并将其设置为参数。谁能给我一些指示?

编辑

所以在x.txt 我有以下行

$variable = '1.2.3';

我需要将 1.2.3 从文件中提取到我的 bash 脚本中,然后用于 zip 文件

【问题讨论】:

  • var=$(grep regex file) 否则您将不得不更加具体。
  • 谢谢凯文。乍一看,这似乎是我需要的。我实际上想从 grep (第 1 组)中提取一个组号。这能应付吗?
  • 你的意思是像group [0-9]\+?当然。或者,如果您只想要号码,grep -oP '(?<=group )[0-9]+'
  • 不,他的意思可能是var=$(sed -ne 's/^[^=]*= *'\([^']*\)'.*/\1/p' file)
  • 感谢您的快速回复。我已经更新了我上面的问题,以澄清文件中的内容以及我需要得到什么

标签: regex bash shell


【解决方案1】:

使用sed 一次性完成

var=$(sed -ne "s/\\\$variable *= *['\"]\([^'\"]*\)['\"] *;.*/\1/p" file)

无论您的值是用单引号括起来还是双引号括起来,上述方法都有效。

另见Can GNU Grep output a selected group?

$ cat dummy.txt
$bla = '1234';
$variable = '1.2.3';
blabla
$variable="hello!"; #comment

$ sed -ne "s/\\\$variable *= *['\"]\([^'\"]*\)['\"] *;.*/\1/p" dummy.txt
1.2.3
hello!

$ var=$(sed -ne "s/^\\\$variable *= *'\([^']*\)' *;.*/\1/p" dummy.txt)

$ echo $var
1.2.3 hello!

† 或至少与sed 相比,与您选择的平台上的grep 相比,它可以有效地处理数据。 :)

【讨论】:

  • 谢谢,我得研究一下sed,因为它似乎是一个很棒的工具。不幸的是,无论出于何种原因,上述方法对我来说似乎都不起作用
  • 我明白了;您的输入实际上是一个 PHP 脚本,因此该行可能是缩进的;我从正则表达式中删除了^,继续重试。
  • 还有,因为您正在处理的是 PHP 脚本,所以我更新了正则表达式以处理双引号。 :)
  • 感谢更新。该代码确实有效,但是我已经使用了上面的代码,现在它正在工作。我赞成你的回答。再次感谢您
  • 没问题。我假设您感兴趣的作业基本上始终位于文件的顶部,并且不能在任何测试之前以 $variable ==... 形式进行任何测试(接受的答案中的 grep 将与那些匹配。):) 还要确保您修改了接受的答案以检查双引号字符串以及 = 周围的不同间距,如果您认为您的 php 源代码有,否则您将丢失值。 :)
【解决方案2】:

您可以使用 grep-chop-chop 技术

var="$(grep -F -m 1 '$variable =' file)"; var="${var#*\'}"; var="${var%\'*}"

【讨论】:

  • 请解释一下。
【解决方案3】:

如果所有文件行都具有该格式($<something> = '<value>'),您可以像这样使用cut

value=$(cut -d"'" -f2 file)

【讨论】:

  • 不幸的是它不是一个 php 脚本
猜你喜欢
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
相关资源
最近更新 更多