【问题标题】:bash regex not working - works with online editorsbash 正则表达式不起作用 - 与在线编辑器一起使用
【发布时间】:2018-11-10 21:50:29
【问题描述】:

Regex 适用于在线编辑器,但不适用于 bash 脚本。尝试了几种不同的方法

#!/bin/bash

echo -n "Your string> "
read String

regex='(?<!NOT.)TEST_34_TEST'

if [[ "$String" =~ ^(\?\<\!NOT\.)TEST_34_TEST ]]; then
    echo Match
else
    echo Non-Match
fi


if [[ "$String" =~ $regex ]]; then
    echo Match
else
    echo Non-Match
fi

我想要匹配 TEST_34_TEST 的字符串,并且它没有前缀

TEST_34_TEST,TEST_34_TEST,TEST_34_TEST -> should match all 3
TEST_34_TEST, NOT_TEST_34_TEST, TEST_34_TEST -> should match 2 values
NOT_TEST_34_TEST, TEST_34_TEST, TEST_34_TEST -> should match 2 values

提前致谢。

【问题讨论】:

  • BASH 正则表达式中没有环顾四周的支持
  • ok 有办法实现吗?
  • 这可能会有所帮助:stackoverflow.com/a/21161095/3776858
  • bash 无论如何都不会捕获单个组的多次出现。你可以匹配NOT_TEST_34_TEST整个字符串要么匹配,要么不匹配。
  • 这不会解决问题,因为它匹配其他字符串与 NOT_TEST_34_TEST 例如:TEST,TEST 将返回 true

标签: regex bash sh


【解决方案1】:

如果你只想知道匹配的数量(而不是对它们做任何事情),你可以使用 GNU grep

for s in "TEST_34_TEST,TEST_34_TEST,TEST_34_TEST" "TEST_34_TEST, NOT_TEST_34_TEST, TEST_34_TEST" "NOT_TEST_34_TEST, TEST_34_TEST, TEST_34_TEST"; do
    grep -noP '((?<!NOT.)TEST_34_TEST)' <<< "$s" | wc -l
done

会打印出来

3
2
2

【讨论】:

    猜你喜欢
    • 2016-08-17
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多