正则表达式

时间:2017-12-13 10:46:19

标签: regex bash

我是bash的新手,我正在尝试编写一个脚本来对LXC主机进行维护,它是你可以在github project找到的容器。 目前我正在尝试将容器的名称分成两个数组:$ active_containers和$ inactive_containers。我构建的正则表达式基于以下内容:

  

Enforce valid container names

     

这需要所有容器名称:
      - 长度在1到63个字符之间       - 仅由字母数字字符和连字符组成       - 不要以数字字符或连字符开头       - 不以连字符结尾

我知道我的正则表达尚不完美,它现在寻找3-63个字符。

我的test.sh:

#!/bin/bashbased
active_containers="$(lxc list -c ns | grep RUNNING)"
echo $active_containers
findcontainers='\b(a-zA-Z{1}a-zA-Z0-9\-{,61}a-zA-Z0-9{1})\b'
echo $active_containers | sed -e $findcontainers
echo "Containers found: $active_containers"

FYI:命令“lxc list -c ns”的输出:

+-------------+---------+
|    NAME     |  STATE  |
+-------------+---------+
| linuxserver | RUNNING |
+-------------+---------+
| websites    | RUNNING |
+-------------+---------+

目前的结果:

| linuxserver | RUNNING | | websites | RUNNING |
sed: -e expression #1, char 37: unterminated address regex

我想得到的结果:

$active_containers(0): "linuxserver"
$active_containers(1): "RUNNING"
$active_containers(2): "websites"
$active_containers(3): "RUNNING"

我一直在搜索(e)grep,sed和awk的stackoverflow和手册,但找不到我做错了什么..

如果我提出重复的问题,我的谦卑道歉 编辑:
如果有人能告诉我我的问题值得一个-1,我会非常感激。我不知道该修复/改进...

1 个答案:

答案 0 :(得分:0)

findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]*$'
echo "$active_containers" | grep "$findcontainers"

匹配3到63个字符,并且在第一个或最后一个位置没有连字符,具体取决于grep版本{必须转义或不具有特殊含义。

findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]\{1,61\}[a-zA-Z0-9]$'
echo "$active_containers" | grep "$findcontainers"

否则使用gnu grep和PCRE(-P perl regex)

findcontainers='^[a-zA-Z0-9][-a-zA-Z0-9]{1,61}[a-zA-Z0-9]$'
echo "$active_containers" | grep -P "$findcontainers"

给定lxc输出,模式名称可能匹配,因为已经过滤的RUNNING可能会有以下帮助:

echo "$active_containers" | grep -Po "\b[a-zA-Z0-9][-a-zA-Z0-9]{1,61}[a-zA-Z0-9](?=\s*\| RUNNING)"
  1. 当作为参数传递给命令时,变量必须用双引号括起来,以避免分词(分成多个参数)。

  2. 过滤匹配的工具是grepsed是替换。

    • ^行首播匹配空字符串
    • [ .. ]是字符集,-位于第一个位置或最后添加连字符-以设置否则定义一系列字符

    • *表示0次或更多次出现

    • $行结束符合空字符串