正则表达式和Bash文件-从另一个文件提取数据并存储在变量中

时间:2018-10-22 20:07:55

标签: regex bash shell

在学习RegEX时,我试图构建一个bash脚本以从文件中提取数据,然后将其存储在变量中,以便可以使用存储的值来使脚本自动化。

我知道SED和GREP的存在,但是我不确定如何正确使用它们。

我需要的值在一个名为/path/to/config.inc.php的文件中

  

mysql:// user:password @ server / user_database

因此,当我学习RegEX时(使用https://regexr.com/网站进行学习),我能够创建此RegEX表达式:

(mysql\:\/\/)(.+.)\:(.+.)@(.+.)\/(.+)

因此,基本上我需要将USER,PASSWORD和USER_DATABASE值存储在脚本中的变量中,例如:

user = $2
password = $3
userdatabase = $5

因此,我可以在bash脚本中调用变量以自动执行某些操作。 最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

您可以使用sed + read

read un pw db < <(sed -En '
s#.*mysql://([^:]+):([^@]+)@[^/]+/([_[:alnum:]]+).*#\1 \2 \3#p' config.inc.php)

# check variable content

declare -p un pw db
declare -- un="user"
declare -- pw="password"
declare -- db="user_database"

RegEx详细信息:

  • .*mysql://:匹配所有文本,直到mysql://
  • ([^:]+):匹配1个以上非冒号字符并在#1组中捕获
  • ::匹配文字冒号
  • ([^@]+):匹配1个以上非@字符并捕获到#2组
  • @:匹配文字@
  • [^/]+/:匹配1+个非/字符,后跟/
  • ([_[:alnum:]]+):匹配1个以上的字符并捕获到#2组
  • .*:匹配所有剩余文本直到结尾
  • 替换是\1 \2 \3,它是该序列中的username password database个值。

答案 1 :(得分:1)

尽管使用正则表达式的答案绝对可以,但是我认为还有另一种更简单的方法可以考虑。 (而且我喜欢regex BTW)。

考虑一下:

mysql:// user:password @ server / user_database

cut -d"@" -f1

mysql:// user:password

cut -d"/" -f3

user:密码

cut -d":" -f1

用户

问题是,regex确实很酷而且有用,但是对于除您之外的任何其他人来说,它都很难理解和维护。

开玩笑说这些话:

有问题吗?使用正则表达式解决它!现在您有两个问题;)