alpine shell grep regex表达式到列表中

k4aesqcs  于 11个月前  发布在  Shell
关注(0)|答案(2)|浏览(145)

我在一个文件中有以下文本:value={VARIABLE_NAME_A}。在这个文件中可能有20多个这样的VARIABLE_NAME_A, B, C, etc
我试图使用shell脚本(不是bash,因为它的alpine和我没有安装bash)使用grep列出所有这些VARIABLE_NAME_A, B, C到一个变量,然后把它们放在一个列表项中,然后在它们上面进行搜索。
然而,从我对正则表达式的理解来看,这种格式应该可以工作.. "{[A-Z]\w+}"。但是grep "{[A-Z]\w+}" filename.txt不会产生任何结果。
不知道我在这里做错了什么?

flvtvl50

flvtvl501#

为了便于移植,你应该使用sed而不是grep,例如使用任何POSIX sed:

sed -n 's/.*{\([[:upper:]][[:alnum:]_]*\)}.*/\1/p' file

字符串
上面的代码假设输入中每行只有一个{VARIABLE}
如果你的sed不符合POSIX,因为它不支持字符类,那么这可能对任何sed都足够了,这取决于你的语言环境和输入文件的其他内容:

sed -n 's/.*{\([A-Z][a-zA-Z0-9_]*\)}.*/\1/p' file

hgc7kmma

hgc7kmma2#

使用上面的文章作为file,但在一个或两个其他示例周围添加大括号进行测试,引用模式中的元字符,grep '{[A-Z]\w\+}' file返回行。
如果您的版本支持-o * 和 * \w\+

$: grep -o '{[A-Z]\w\+}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

字符串
如果-o而不是\w

$: grep -o '{[A-Z][A-Za-z0-9_]\+}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: grep -o '{[A-Z][A-Za-z0-9_][A-Za-z0-9_]*}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: grep -o '{[[:upper:]][[:alnum:]_]\+}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: grep -o '{[[:upper:]][[:alnum:]_][[:alnum:]_]*}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}


或者awk,虽然我相信有比这更好的方法.

$: awk -v ORS='' '/\{[A-Z][A-Za-z0-9_]+\}/{print gensub(/([^{]*)(\{[A-Z][A-Za-z0-9_]+\})([^{]*)/, "\\2\n", "g", $0);}' file   {VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: awk -v ORS='' '/\{[A-Z][[:alnum:]_]+\}/{print gensub(/([^{]*)(\{[A-Z][[:alnum:]_]+\})([^{]*)/, "\\2\n", "g", $0);}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: awk -v ORS='' '/\{[A-Z][A-Za-z0-9_][A-Za-z0-9_]*\}/{print gensub(/([^{]*)(\{[A-Z][A-Za-z0-9_][A-Za-z0-9_]*\})([^{]*)/, "\\2\n", "g", $0);}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}


perl,这也应该是相当普遍的这些天...

$: perl -ne 's/[^{]*({[A-Z]\w+})[^{]*/$1\n/g and print' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}


有了sed *,

$: sed -n 's/.*\({[A-Z][A-Za-z0-9_]\+}\).*/\1/p' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: sed -n 's/.*\({[A-Z][A-Za-z0-9_][A-Za-z0-9_]*}\).*/\1/p' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: sed -n 's/.*\({[[:upper:]][[:alnum:]_]\+}\).*/\1/p' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

$: sed -n 's/.*\({[[:upper:]][[:alnum:]_][[:alnum:]_]*}\).*/\1/p' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

  • 请注意,如果给定行上有多个匹配项,则sed解决方案会中断。
$: sed -n 's/[^{]*\({[[:upper:]][[:alnum:]_]\+}\)[^{]*/\1/gp' file
{VARIABLE_NAME_A}{VARIABLE_NAME_A}
{VARIABLE_NAME_A}


一个特定于GNU的解决方案是

$: sed -n '/{[[:upper:]][[:alnum:]_]\+}/{s/[^{]*\({[[:upper:]][[:alnum:]_]\+}\)[^{]*/\1/g;s/}{/}\n{/g;p}' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}


如果我没有搞砸任何事情,我认为这是一个更完整的解决方案,将与任何sed-

$: sed -n '
   s/^[^{]*{/{/
   s/}[^}]*$/}/
   s/}{[^}]*/}\n{/gm
   s/{[^[:upper:]][^}]*}//g
   s/{[[:upper:]][^}]*[^[:alnum:]_}]\+[^}]*}//g
   s/[^{]*\({[[:upper:]][[:alnum:]_]\+}\)[^{]*/\1/g
   s/}{/}\n{/g
   /{[[:upper:]][[:alnum:]_]\+}/p
 ' file
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}
{VARIABLE_NAME_A}

相关问题