我有一个变量,其中包含用空格分隔的键/值:
echo $PROPERTY
server_geo=BOS db.jdbc_url=jdbc\:mysql\://mysql-test.com\:3306/db02 db.name=db02 db.hostname=/mysql-test.com datasource.class.xa=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource server_uid=BOS_mysql57 hibernate33.dialect=org.hibernate.dialect.MySQL5InnoDBDialect hibernate.connection.username=db02 server_labels=mysql57,mysql5,mysql db.jdbc_class=com.mysql.jdbc.Driver db.schema=db02 hibernate.connection.driver_class=com.mysql.jdbc.Driver uuid=a19ua19 db.primary_label=mysql57 db.port=3306 server_label_primary=mysql57 hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
我需要提取单个键的值,例如 db.jdbc_url 。 使用一个代码段,我发现:
echo $PROPERTY | sed -e 's/ db.jdbc_url=\(\S*\).*/\1/g'
但这还会返回在我的密钥之前找到的其他属性。 任何帮助如何解决它? 谢谢
答案 0 :(得分:2)
如果db.name
始终跟随db.jdbc_url
,则使用grep
lookaround,
$ echo "${PROPERTY}" | grep -oP '(?<=db.jdbc_url=).*(?=db.name)'
jdbc\:mysql\://mysql-test.com\:3306/db02
或将VAR添加到数组中,
$ myarr=($(echo $PROPERTY))
$ echo "${myarr[1]}" | grep -oP '(?<=db.jdbc_url=).*(?=$)'
jdbc\:mysql\://mysql-test.com\:3306/db02
答案 1 :(得分:1)
您可以为此使用grep
,
echo $PROPERTY | grep -oE "db.jdbc_url=\S+" | cut -d'=' -f2
正则表达式非常接近您与sed
一起使用的正则表达式。
-o
选项用于打印匹配行的匹配部分。
编辑:如果只需要该值,请剪切'='
编辑2 :egrep
说它已过时,因此使用grep -oE
,结果相同。只是为了涵盖所有基础:-)
答案 2 :(得分:1)
这是由于您使用替代命令(sed s/.../.../
)引起的,因此正则表达式之前的所有文本均保持原样。在.*
之前使用db\.jdbc_url
以及字符串标记的开始(^
)/结束($
),可以使变量的全部内容匹配。
为了完全安全,您的正则表达式应为:
sed -e 's/^.*db\.jdbc_url=\(\S*\).*$/\1/g'