【问题标题】:parse only first delimiter in bash仅解析 bash 中的第一个分隔符
【发布时间】:2017-05-25 13:18:01
【问题描述】:

请在下面找到函数 (keyvalue.sh),该函数使用键值对解析配置文件以返回传递的参数键的值。

如果值没有任何=(等于运算符),它工作正常,但如果值包含=(等于)运算符,它返回不正确的值。

function getValueForKey(){
    while read -r line
    do
        #echo $line
        key=`echo $line | cut -d = -f1`
        value=`echo $line | cut -d = -f2`

        if [ "$2" == "$key" ]; then
            echo $value
        fi;

    done < "$1"
}

请在下面找到示例键值配置文件(keys.txt):-

Scala_Url="http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz"
Zookeeper_Url="http://www-eu.apache.org/dist/zookeeper/stable/zookeeper-3.4.10.tar.gz"
Eclipse_Url="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-jee-neon-3-win32-x86_64.zip&mirror_id=1135"

另外,找到下面的示例执行:-

$ls                                                                                                                                                                     
keys.txt  keyvalue.sh                                                                                                                                                   
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$cat keys.txt                                                                                                                                                           
Scala_Url="http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz"                                                                                                
Zookeeper_Url="http://www-eu.apache.org/dist/zookeeper/stable/zookeeper-3.4.10.tar.gz"                                                                                  
Eclipse_Url="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-jee-neon-3-win32-x86_64.zip&mirror_id=1135"            
$                                                                                                                                                                       
$                                                                                                                                                                       
$. keyvalue.sh                                                                                                                                                                       
$                                                                                                                                                                       
$getValueForKey keys.txt "Scala_Url"                                                                                                                                    
"http://downloads.lightbend.com/scala/2.11.8/scala-2.11.8.tgz"                                                                                                          
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$getValueForKey keys.txt "Zookeeper_Url"                                                                                                                                
"http://www-eu.apache.org/dist/zookeeper/stable/zookeeper-3.4.10.tar.gz"                                                                                                
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$getValueForKey keys.txt "Eclipse_Url"                                                                                                                                  
"http://www.eclipse.org/downloads/download.php?file                                                                                                                     
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$cat keyvalue.sh                                                                                                                                                        
function getValueForKey(){                                                                                                                                              
        while read -r line                                                                                                                                              
        do                                                                                                                                                              
                #echo $line                                                                                                                                             
                key=`echo $line | cut -d = -f1`                                                                                                                         
                value=`echo $line | cut -d = -f2`                                                                                                                       

                if [ "$2" == "$key" ]; then                                                                                                                             
                        echo $value                                                                                                                                     
                fi;                                                                                                                                                     

        done < "$1"                                                                                                                                                     
}$                                                                                                                                                                      
$                                                                                                                                                                       
$                                                                                                                                                                       
$                                                                                                                                                                       
$    

【问题讨论】:

  • 请不要张贴文字图片。将其复制并粘贴为此处的代码块。否则很难阅读,对于视力受损的人来说是不可能的。
  • @JNevill:谢谢!没有阅读= 是价值的一部分。
  • @mogli, ...btw,考虑尝试改掉使用function 关键字的习惯。它使您的代码与 POSIX sh 不兼容,但不会增加任何补偿性好处。

标签: bash shell parsing delimiter


【解决方案1】:

您根本不应该为此使用cut

getValueForKey(){
    while IFS== read -r key value;
    do
        if [ "$2" = "$key" ]; then
            echo "$value"
        fi;

    done < "$1"
}

read 将分割输入分隔符= 上的行,如果字段多于命名变量,它将所有剩余的行分配给最终命名的变量(在本例中为value)。

但实际上你应该改变你的格式。至少,对输入进行排序并使用look 来查找值。

【讨论】:

    【解决方案2】:

    William Pursell's helpful answer是一种有效的纯shell方案,但这样的方案难免会很慢,这也是William推荐结合look的key-sorted配置文件的原因。

    不需要排序的替代方法是使用awk

    getValueForKey() {
      awk -F= -v key="$2" '$1 == key { sub(/^[^=]+=/, ""); print }' "$1"
    }
    
    • -F= 通过 所有= 的出现将每一行拆分为字段
    • 我们仍然可以使用第一个字段(关键字段)$1 将其与感兴趣的关键值进行比较。
    • 然而,为了输出相应的值,使用字符串替换来确保该值按原样输出,即使它包含= 实例:
      • sub(/^[^=]+=/, "") 替换 (sub()) 从行首 (^) 到 first 的所有内容 = 实例 ([^=]+ 匹配非空序列 (+)字符除了 (^) = 后跟=) 和空字符串,只留下值。

    示例调用:

    $ getValueForKey keys.txt 'Eclipse_Url'
    "http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/neon/3/eclipse-jee-neon-3-win32-x86_64.zip&mirror_id=1135"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      • 1970-01-01
      • 2016-09-15
      • 1970-01-01
      • 2021-09-11
      • 2011-01-08
      • 2014-12-30
      相关资源
      最近更新 更多