shell解析一行以查找某个标记

时间:2014-01-13 10:46:06

标签: bash shell

我打算根据存储在属性文件中的值创建一个简单的脚本来编辑文件。 所以基本上我打算遍历原始文件中的每一行,当它遇到一行中的某个标记时说“/#”它将获得标记后面的文本,即证书,然后实现一个函数来解析属性file获取特定值并将其添加到原始文件中。 例如,文件将包含以下行:

“/#证书”

我不确定如何最好地搜索标签,我计划找一个if来查找/#然后拆分剩下的文本来获取字符串。

while read line
    do

    #need to parse line to look for tag


    echo line >> ${NEW_FILE}
    done < ${OLD_FILE}

非常感谢任何帮助

=====================================

编辑:

我的解释有点差;道歉。我只是想在/#之后得到文本 - 即我只想获得它之前的字符串值。然后我可以根据文本调用函数。

3 个答案:

答案 0 :(得分:1)

您可以使用BASH正则表达式功能:

while read line
do
if [[ "$line" =~ ^.*/#certs(.*)$ ]]; then
    # do your processing here 
    # echo ${BASH_REMATCH[1]} is the part after /#certs
    echo echo ${BASH_REMATCH[1]} >> ${NEW_FILE}
fi
done < ${OLD_FILE}

答案 1 :(得分:1)

这可以移植到Bourne shell,因此当然是ksh和Bash。

case $line in
    '/#'* ) tag="${line#/\#}" ;;
esac

将它置于某种上下文中,这是一个更实际的例子,说明如何使用它:

while read line; do
    case $line in
        '/#'* ) tag="${line#/\#}" ;;
        *) continue ;; # skip remainder of loop for lines without a tag
    esac
    echo "$tag"
    # Or maybe do something more complex, such as
    case $tag in
        cert)
           echo 'We have a cert!' >&2 ;;
        bingo)
           echo 'You are the winner.' >&2
           break # terminate loop
           ;;
        esac
done <$OLD_FILE >$NEW_FILE

答案 2 :(得分:0)

例如,您可以使用流编辑器sed一步搜索字符串并对其进行操作。

echo $line | sed -rn 's:^.*/#(certs.+):\1:p'

这将仅打印相关行/#之后的相关部分。