从方括号中提取字符串

时间:2014-02-24 13:13:59

标签: regex bash sed awk

我需要从此示例字符串中获取值 myfile.ext 'My message [file:myfile.ext]'

我看到了similar question,但是如果括号不在字符串中,则无法使字符串返回空字符串。

我需要检查字符串是否包含[file:***]并返回变量***否则必须为空值。

3 个答案:

答案 0 :(得分:3)

您可以使用grep

$ grep -Po '(?<=\[file:)[^]]*(?=])' file
myfile.ext

与...相同(取决于您是从文件或管道中读取):

$ echo "'My message [file:myfile.ext]'" | grep -Po '(?<=\[file:)[^]]*(?=])'
myfile.ext

解释

它会查找[file:之后到下一个]之后的字符串。要将其存储到变量中,请使用var=$(command)表达式:

result=$(grep -Po '(?<=\[file:)[^]]*(?=])' file)

默认情况下为空,否则为myfile.ext

示例

$ cat a
My message [file:myfile.ext
My message [file:myfile.ext]]a]

$ grep -Po '(?<=\[file:)[^]]*(?=])' a
myfile.ext

答案 1 :(得分:3)

您可以使用sed的-n标志来禁止打印所有行,然后专门使用正则表达式中的p标志来打印匹配项:

sed -n 's/\[file:\([^\]*\)]/\1/p' file

答案 2 :(得分:1)

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

[[ "$s" == *[* ]] && [[ "$s" =~ \[[^:]*:([^\]]+)\] ]] && echo "${BASH_REMATCH[1]}"
myfile.ext