如何在Bash中的引号之间提取char序列?

时间:2018-02-06 15:17:43

标签: bash sed grep substring

我有一个适用于Java的属性文件,如:

oracle {
    username = "bla"
    password = "blabla"
    driver = "driver1"
}

postgres {
    username = "pg"
    password = "pg"
    driver = "pg-driver"
}

当读入java时,我可以提取返回oracle.driver的{​​{1}}属性。 现在我想在bash脚本中提取相同的字符串。 我尝试过类似的东西:

driver1

返回grep -A5 oracle application.conf | grep -Po 'driver = ".*?"' | grep -Po '".*"' (包括引号)。我也尝试使用"driver1",但也没有产生sed substitute字符串。

如何仅检索driver1

4 个答案:

答案 0 :(得分:2)

每当你有名字时 - >数据中的值映射,首先创建一个数组来存储这些映射(下面是f[])然后通过它的名称访问数据提供了最简单,最清晰和最容易增强的解决方案:

$ awk -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f["username"]}' file
"bla"

$ awk -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f["password"]}' file
"blabla"

$ awk -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f["driver"]}' file
"driver1"

$ awk -v name="driver" -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f[name]}' file
"driver1"

答案 1 :(得分:1)

使用awk,您可以使用空记录分隔符执行此操作:

awk -v RS= '/^[[:blank:]]*oracle/{
gsub(/.*driver[[:blank:]]*=[[:blank:]]*|\n.*$|"/, ""); print}' application.conf

driver1

RS使所有连续的非空行成为一条记录。

答案 2 :(得分:1)

使用单个 awk 命令 - 可以在任何 awk 实施中使用:

awk '/oracle/{ f=1 }f && $1=="driver"{ gsub(/"/,""); print $3; exit }' file
  • /oracle/{ f=1 } - 遇到与模式匹配的行oracle - 设置有效标记f
  • f && $1=="driver" - 如果它是&#34;活跃的&#34;已处理的部分(&#34; oracle&#34;)和第一个字段$1等于driver
    • gsub(/"/,"") - 从行
    • 中删除双引号
    • print $3 - 打印第三个字段,即驱动程序
    • exit - 立即退出脚本执行,避免冗余处理

输出:

driver1

答案 3 :(得分:0)

您也可以尝试使用sed

  require 'thin'
  require 'rack'

  class App
            def initialize()
               puts 'init'
    end

    def call(env)
            puts 'got it'
            sleep(60)
            [ 200, { "Content-Type" => "text/plain" }, ["hello"] ]
    end

  end

  Rack::Handler::Thin.run(App.new, options = {:Host => '0.0.0.0', :Port => 8083}) do |server|
       puts server.class
       server.threaded = true
  end