在学习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脚本中调用变量以自动执行某些操作。 最好的方法是什么?
答案 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确实很酷而且有用,但是对于除您之外的任何其他人来说,它都很难理解和维护。
开玩笑说这些话:
有问题吗?使用正则表达式解决它!现在您有两个问题;)