【问题标题】:Get value from string based on RegEx基于 RegEx 从字符串中获取值
【发布时间】:2017-02-23 15:32:24
【问题描述】:

我有一个我想要学习的 bash 脚本。我有一个 sql 文件:

create user myuser with password 'mypassword';

我想使用 sed 并将密码值存储在一个 bash 变量中,并将密码存储在另一个 bash 变量中。我正在学习的脚本有:

USERNAME := $(shell sed -n \
"s/^create user \(\S\+\) with password '\(\S\+\)';$$/\1/p" \
createdb.sql)
PASSWORD := $(shell sed -n \
"s/^create user \(\S\+\) with password '\(\S\+\)';$$/\2/p" \
createdb.sql)

无论我尝试什么,正则表达式都不会匹配。我的部分问题是我不了解 sed 的基础知识。如何获取部分字符串的值?

【问题讨论】:

    标签: linux bash centos7


    【解决方案1】:

    不要为此使用sed;使用bash的内置正则表达式支持。

    str="create user myuser with password 'mypassword';"
    regex='create user (.*) with password (.*);'
    if [[ $str =~ $regex ]]; then
        username=${BASH_REMATCH[1]}
        password=${BASH_REMATCH[2]}
    fi
    

    至于你如何得到合适的行,使用grep

    str=$(grep "create user" createddb.sql)
    

    【讨论】:

    • $str 在这种情况下是文件?
    • hm... 使用外部 grep 并在 bash 内置正则表达式之后,而不是一个外部 sed + 读取?
    • 你可以,但我觉得这更简单一些。它本质上使用多字符分隔符with password 来分隔两个值,而不是试图想出一个安全的单字符分隔符以在IFS 中使用以让read 重新拆分sed 的输出。
    • 只要你能找到一个没有出现在 user 中的字符(在这种情况下这可能是微不足道的),像 IFS=% read user passwd < <(sed 's/create user (.*) with password (.*)/\1%\2/') 这样的就可以了。在另一个极端,您甚至可以通过使用while 循环逐行读取文件来放弃对grep 的调用,但我怀疑grep 会更快,除非您有一个非常小的文件或行问题很早就发现了。 grep + =~ 恰好是(IMO)两个极端之间最简单的平衡。
    猜你喜欢
    • 2018-10-19
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2018-09-27
    • 2014-06-24
    • 2012-11-11
    • 1970-01-01
    • 2018-05-19
    相关资源
    最近更新 更多