【问题标题】:shell bash replacing tags in a line with values from a different fileshell bash用来自不同文件的值替换一行中的标签
【发布时间】:2014-02-02 11:31:33
【问题描述】:

我正在尝试读取文件中的行,如果该行包含标签,则标签中的文本用于将标签替换为来自不同属性文件的值,在该行之前,所有标签都被替换一个不同的文件。

因此,正在读取的初始文件具有遵循以下格式的行:

testkey "TEST-KEY" "[#key_location#]:///[#key_name#]"

其中 [# 和 #] 包含标签文本。

属性文件将包含如下行:

key_location=location_here
key_name=test_key_name

所以我想要达到的最终结果是该行被写入一个新文件,但是标签被替换为属性文件中的值,所以使用上面的内容:

testkey "TEST-KEY" "loaction_here:///test_key_name"

我不确定如何最好地处理标签并在一行中处理多个标签,我很迷茫。任何帮助将不胜感激。

骨架代码:

while read line

    if [[ $line == *[#* ]]
    then
       #echo found a tag and need to deal with it





    else

        echo "$line">> $NEW_FILE
    fi

   done < $INITIAL_FILE

编辑

文件中的行可以包含一个或多个标签,而不是像给出的示例中那样总是两个。

【问题讨论】:

  • 您的属性文件包含多个键/名称,对吧?确切的格式是什么? abc_location=asdf abc_name=asdf xyz_location=asdf xyz_name=asdf 之类的东西?还是奇数行包含关键位置,偶数行包含前面关键位置的关键名称?
  • 属性文件每行都有一个值,它不仅对应于键,还有很多其他值。标记内的文本将始终对应于属性名称(即 = 之前的位)。认为我需要 sed 替换标签的新行,只是不确定如何因为我对 shell 的了解很可怜

标签: string bash shell sed ksh


【解决方案1】:

您必须进行一些循环和全局 sed 替换。以下内容可能不是最佳的,但可以帮助您入门:

#!/bin/bash

declare -A props
while read line ; do
    key=$(echo $line | sed -r 's/^(.*)=.*/\1/')
    value=$(echo $line | sed -r 's/^.*=(.*)/\1/')
    props[$key]=$value
done < values.properties

replace() {
    line=$1
    for key in "${!props[@]}"; do 
        line=$(echo $line | sed "s/\[#$key#\]/${props[$key]}/g")
    done
    echo $line
}

while read line ; do
    while [[ $line == *"[#"*"#]"* ]] ;do
        line=$(replace "$line")
        echo Iter: $line
    done
    echo DONE: $line
done < $INITIAL_FILE

sn-p 打印到标准输出并包含中间结果,以便您检查它是如何工作的。我认为您可以轻松修改它以写入文件等。

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点(例如计数#)。但简单地说,您可以在字符串的开头和结尾之外使用* 扩展,所以

    if [[ $line == *"[#"*"#]"*"[#"*"#]"* ]]; then 
      echo "has tags"
    else 
      echo "does not have tags" 
    fi
    

    适用于您的情况,例如

    $ echo "$line" 
    testkey "TEST-KEY" "[#key_location#]:///[#key_name#]"
    $ if [[ $line == *"[#"*"#]"*"[#"*"#]"* ]]; then echo "has tags"; fi
    has tags
    

    【讨论】:

    • 啊,这很好,我没有考虑在标签之间使用 *。但是,对于有一个标签或可能超过 2 个标签的行,我会遇到问题。也许我可以 grep 标签的行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2014-02-09
    • 2020-10-01
    • 1970-01-01
    • 2016-09-14
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多