Bash shell解析一行以查找特定标记

Bash shell解析一行以查找特定标记,bash,shell,Bash,Shell,我计划创建一个简单的脚本,根据存储在属性文件中的值编辑文件。 因此,本质上我计划循环遍历原始文件中的每一行,当它在一行中遇到某个标记时,比如“/#”,它将获得标记后面的文本,即certs,然后实现一个函数来解析属性文件,以获得某些值并将其添加到原始文件中。 例如,该文件将有以下行: “/#证书” 我不确定如何最好地搜索标记,我计划使用if查找/#,然后拆分剩余文本以获得字符串 while read line do #need to parse line to look for

我计划创建一个简单的脚本,根据存储在属性文件中的值编辑文件。 因此,本质上我计划循环遍历原始文件中的每一行,当它在一行中遇到某个标记时,比如“/#”,它将获得标记后面的文本,即certs,然后实现一个函数来解析属性文件,以获得某些值并将其添加到原始文件中。 例如,该文件将有以下行:

“/#证书”

我不确定如何最好地搜索标记,我计划使用if查找/#,然后拆分剩余文本以获得字符串

while read line
    do

    #need to parse line to look for tag


    echo line >> ${NEW_FILE}
    done < ${OLD_FILE}
读取行时
做
#需要分析行以查找标记
回显行>>${NEW_FILE}
完成<${OLD_FILE}
任何帮助都将不胜感激

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

编辑:


我的解释有点拙劣;道歉。我只是想得到/#-后面的文本,也就是说,我只想得到它前面的字符串值。然后,我可以根据文本内容调用函数。

您可以使用BASH regex功能:

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}
读取行时
做
如果[[“$line”=~^.*/#证书(.*)$];然后
#你在这里处理吗
#echo${BASH_REMATCH[1]}是/#certs之后的部分
echo echo${BASH_重新匹配[1]}>${NEW_FILE}
fi
完成<${OLD_FILE}

这可以移植到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
读行时
;做
案例$line in
“/”*)tag=“${line/\ \”;;
*)继续;#对于没有标记的行,跳过循环的其余部分
以撒
回显“$tag”
#或者做一些更复杂的事情,比如
案例$tag in
证书)
echo“我们有证书!”>&2.
宾果游戏)
echo“你是赢家。”>&2
中断#终止循环
;;
以撒
完成$NEW\u文件

例如,您可以使用流编辑器搜索字符串并一步操作它们

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

这将只打印相关行的
/#
后面的相关部分。

您的问题被标记为sh bash ksh——这是指“任何”还是“所有”?不确定是否需要反斜杠/是否有用。Bash可以使用它,也可以不使用它,但我怀疑其他shell可能需要它。我正在尝试获取/#之后的文本部分,即,我希望获取“certs”位,然后我将执行一个函数,根据该文本执行操作。sed仍然可以这样做吗?我修改了答案,使sed只打印
/#
之后的部分。但它仍然在寻找
证书,而不是任何标签。