Bash 检查字符串是否包含-&引用;及「&引用;同时

Bash 检查字符串是否包含-&引用;及「&引用;同时,bash,Bash,我在Bash中有下面两个正则表达式: 1.^[-a-zA-Z0-9\,\.\;\:]*$ 2.^[]a-zA-Z0-9\,\.\;\:]*$ 当字符串包含“-”和其他值时,第一个匹配。 第二个参数包含“]”。 我把这个值放在正则表达式的开头,因为我不能替换它们。 如何同时匹配这两个值?也许,这可以帮助您 #!/bin/bash while read p; do echo $p | grep -E '\-.*\]|\].*\-' | grep "^[]a-zA-Z0-9,.;:-]*$" don

我在Bash中有下面两个正则表达式:

1.^[-a-zA-Z0-9\,\.\;\:]*$
2.^[]a-zA-Z0-9\,\.\;\:]*$
当字符串包含“-”和其他值时,第一个匹配。 第二个参数包含“]”。 我把这个值放在正则表达式的开头,因为我不能替换它们。
如何同时匹配这两个值?

也许,这可以帮助您

#!/bin/bash
while read p; do
echo $p | grep -E '\-.*\]|\].*\-' | grep "^[]a-zA-Z0-9,.;:-]*$"
done <$1

user-host:/tmp$ cat test
-i]string
]adfadfa-
string-
]string
str]ing
]123string
123string-
?????
++++++


user-host:/tmp$ ./test.sh test
-i]string
]adfadfa-
#/bin/bash
读p;做
echo$p|grep-E'\-.\]\.\].\'''.'grep“^[]a-zA-Z0-9,.;:-]*$”

完成也许,这可以帮助你

#!/bin/bash
while read p; do
echo $p | grep -E '\-.*\]|\].*\-' | grep "^[]a-zA-Z0-9,.;:-]*$"
done <$1

user-host:/tmp$ cat test
-i]string
]adfadfa-
string-
]string
str]ing
]123string
123string-
?????
++++++


user-host:/tmp$ ./test.sh test
-i]string
]adfadfa-
#/bin/bash
读p;做
echo$p|grep-E'\-.\]\.\].\'''.'grep“^[]a-zA-Z0-9,.;:-]*$”

完成您还可以将
-
放在括号表达式的末尾,因为两端必须闭合一个范围

^[]a-zA-Z0-9,.;:-]*$

您也不必转义任何其他角色。冒号、分号和逗号在正则表达式的任何部分都没有特殊意义,而句号在括号表达式中失去了特殊意义。

您也可以将
-
放在括号表达式的末尾,因为两端必须闭合一个范围

^[]a-zA-Z0-9,.;:-]*$

您也不必转义任何其他角色。冒号、分号和逗号在正则表达式的任何部分都没有特殊意义,而句号在括号表达式中失去了特殊意义。

基本上,您可以使用:

grep -E '^.*\-.*\[|\[.*\-.*$'
它匹配一个
-
后跟零个或多个任意字符和一个
[
或一个
[
后跟零个或多个字符和一个
-

但是,由于您不接受任意字符,因此需要将其更改为:

grep -E '^[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*\[|\[[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*$'

基本上,您可以使用:

grep -E '^.*\-.*\[|\[.*\-.*$'
它匹配一个
-
后跟零个或多个任意字符和一个
[
或一个
[
后跟零个或多个字符和一个
-

但是,由于您不接受任意字符,因此需要将其更改为:

grep -E '^[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*\[|\[[a-zA-Z0-9,.;:]*\-[a-zA-Z0-9,.;:]*$'

你的帖子里有两个问题

  • 一个是在描述中:

    如何使这两个值同时匹配

    这是一个
    匹配,可以使用混合了两个范围的范围进行匹配:

    pattern='^[]a-zA-Z0-9,.;:-]*$'
    
    这将匹配包含一个(或多个)
    -
    ..
    ..
    ]
    ..
    或任何包含字符的行。这将是下面测试脚本中的所有行(除了
    ???
    ++
    作为df gh

  • 标题中有两个:

    …字符串同时包含“-”和“]”

    这是一个
    匹配。最简单(也是最慢)的方法是:

    echo "$line"  |  grep '-'  |  grep ']'   |  grep '^[-a-zA-Z0-9,.;:]*$'
    
    对grep的前两次调用仅选择以下行:

    同时包含(一个或多个)
    -
    和(一个或多个)
    ]

  • 测试脚本:

    #!/bin/bash
    
    printlines(){
    cat <<-\_test_lines_
    asdfgh
    asdfgh-
    asdfgh]
    as]df
    as,df
    as.df
    as;df
    as:df
    as-df
    as]]]df
    as---df
    asAS]]]DFdf
    as123--456DF
    as,.;:-df
    as-dfg]h
    as]dfg-h
    a]s]d]f]g]h
    a]s]d]f]g]h-
    s-t-r-i-n-g]
    as]df-gh
    123]asdefgh
    123asd-fgh-
    ?????
    ++++++
    as df gh
    _test_lines_
    }
    
    pattern='^[]a-zA-Z0-9,.;:-]*$'
    
    printf '%s\n' "Testing the simple pattern of $pattern"
    while read line; do
        resultgrep="$(  echo "$line" | grep "$pattern"  )"
        printf '%13s %-13s\n' "$line" "$resultgrep"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    p1='-'; p2=']'; p3='^[]a-zA-Z0-9,.;:-]*$'
    
    printf '%s\n' "Testing a 'grep AND' of '$p1', '$p2' and  '$p3'."
    while read line; do
        resultgrep="$(  echo "$line" | grep "$p1" | grep "$p2" | grep "$p3"  )"
        [[ $resultgrep ]] && printf '%13s %-13s\n' "$line" "$resultgrep"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    printf '%s\n' "Testing an 'AWK AND' of '$p1', '$p2' and  '$p3'."
    while read line; do
        resultawk="$(  echo "$line" | 
        awk -v p1="$p1" -v p2="$p2" -v p3="$p3" '$0~p1 && $0~p2 && $0~p3' )"
        [[ $resultawk ]] && printf '%13s %-13s\n' "$line" "$resultawk"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    printf '%s\n' "Testing a 'bash AND' of '$p1', '$p2' and  '$p3'."
    while read line; do
        rgrep="$(  echo "$line" | grep "$p1" | grep "$p2" | grep "$p3"  )"
        [[ ( $line =~ $p1 ) && ( $line =~ $p2 ) && ( $line =~ $p3 ) ]]
        rbash=${BASH_REMATCH[0]}
        [[ $rbash ]] && printf '%13s %-13s %-13s\n' "$line" "$rgrep" "$rbash"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    !/bin/bash
    打印行(){
    
    cat你的帖子里有两个问题

  • 一个是在描述中:

    如何使这两个值同时匹配

    这是一个
    匹配,可以使用混合了两个范围的范围进行匹配:

    pattern='^[]a-zA-Z0-9,.;:-]*$'
    
    这将匹配包含一个(或多个)
    -
    ..
    ..
    ]
    ..
    或任何包含字符的行。这将是下面测试脚本中的所有行(除了
    ???
    ++
    作为df gh

  • 标题中有两个:

    …字符串同时包含“-”和“]”

    这是一个
    匹配。最简单(也是最慢)的方法是:

    echo "$line"  |  grep '-'  |  grep ']'   |  grep '^[-a-zA-Z0-9,.;:]*$'
    
    对grep的前两次调用仅选择以下行:

    同时包含(一个或多个)
    -
    和(一个或多个)
    ]

  • 测试脚本:

    #!/bin/bash
    
    printlines(){
    cat <<-\_test_lines_
    asdfgh
    asdfgh-
    asdfgh]
    as]df
    as,df
    as.df
    as;df
    as:df
    as-df
    as]]]df
    as---df
    asAS]]]DFdf
    as123--456DF
    as,.;:-df
    as-dfg]h
    as]dfg-h
    a]s]d]f]g]h
    a]s]d]f]g]h-
    s-t-r-i-n-g]
    as]df-gh
    123]asdefgh
    123asd-fgh-
    ?????
    ++++++
    as df gh
    _test_lines_
    }
    
    pattern='^[]a-zA-Z0-9,.;:-]*$'
    
    printf '%s\n' "Testing the simple pattern of $pattern"
    while read line; do
        resultgrep="$(  echo "$line" | grep "$pattern"  )"
        printf '%13s %-13s\n' "$line" "$resultgrep"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    p1='-'; p2=']'; p3='^[]a-zA-Z0-9,.;:-]*$'
    
    printf '%s\n' "Testing a 'grep AND' of '$p1', '$p2' and  '$p3'."
    while read line; do
        resultgrep="$(  echo "$line" | grep "$p1" | grep "$p2" | grep "$p3"  )"
        [[ $resultgrep ]] && printf '%13s %-13s\n' "$line" "$resultgrep"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    printf '%s\n' "Testing an 'AWK AND' of '$p1', '$p2' and  '$p3'."
    while read line; do
        resultawk="$(  echo "$line" | 
        awk -v p1="$p1" -v p2="$p2" -v p3="$p3" '$0~p1 && $0~p2 && $0~p3' )"
        [[ $resultawk ]] && printf '%13s %-13s\n' "$line" "$resultawk"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    printf '%s\n' "Testing a 'bash AND' of '$p1', '$p2' and  '$p3'."
    while read line; do
        rgrep="$(  echo "$line" | grep "$p1" | grep "$p2" | grep "$p3"  )"
        [[ ( $line =~ $p1 ) && ( $line =~ $p2 ) && ( $line =~ $p3 ) ]]
        rbash=${BASH_REMATCH[0]}
        [[ $rbash ]] && printf '%13s %-13s %-13s\n' "$line" "$rgrep" "$rbash"
    done < <(printlines)
    echo "#############################################################"
    echo
    
    !/bin/bash
    打印行(){
    
    对我的grep来说,如果你把
    -
    放在右方括号的前面,它似乎是有效的
    ..\:-]
    (第2部分)。对我的grep来说,如果你把
    -
    放在右方括号的前面,它似乎是有效的
    ..\:-]
    (第2部分)这也将匹配既不包含
    ]
    也不包含
    -
    的'aaaa',这两个原始正则表达式也是如此;我只是回答如何在同一个括号表达式中包含
    ]
    -
    。这也将匹配既不包含
    ]
    也不包含
    -
    的'aaaa'两个原始正则表达式;我只是回答如何在同一个括号表达式中同时包含
    ]
    -