如何在bash中的特殊字符之间进行提取?

时间:2018-03-19 00:00:39

标签: regex bash shell

我有一句话:db.COLLECTION_NAME.insert(document)

  1. 我需要提取db..insert之间的任何内容,例如COLLECTION_NAME

  2. 此示例中的() document之间的任何内容。

  3. 我试过了:

     document="${cmd#db*insert(}"
    

    用于document,但它会获得document),如果文档包含特殊字符,则会崩溃

    有什么建议吗?

4 个答案:

答案 0 :(得分:3)

$ echo "db.COLLECTION_NAME.insert(document)" | awk -F'[.()]' '{print $2,$4}'

将给出

COLLECTION_NAME document

您可以使用read

将这些分配给变量
read a b < <(echo "db.COLLECTION_NAME.insert(document)" | awk -F'[.()]' '{print $2,$4}');

答案 1 :(得分:2)

我猜你可以分两步使用大括号扩展来做到这一点:

str='db.COLLECTION_NAME.insert(document)'
temp=${str/db./}
str=${temp/.insert*/}
echo $str
COLLECTION_NAME 

答案 2 :(得分:2)

#!/bin/bash

# set x to a "typical" input value
x='db.COLLECTION_NAME.insert(document)'

# print it out, just so you see it
echo "x == ${x}"

if [[ "${x}" =~ ^db\.(.*)\.insert.* ]]; then
    # we have a match
    ans="${BASH_REMATCH[1]}"
    # print the substring that matches the pattern
    echo "answer == ${ans}"
else
    # sorry no match
    echo "no match"
fi

答案 3 :(得分:1)

以下是使用BASH匹配运算符的替代方法:

regex='db[.](.*)[.]insert.*'
str='db.COLLECTION_NAME.insert(document)'
if [[ $str =~ $regex ]]; then 
   result=${BASH_REMATCH[1]}
fi
echo $result
COLLECTION_NAME