Bash正则表达式匹配跨越多行

时间:2013-11-11 14:27:25

标签: regex bash if-statement

我正在尝试创建一个验证文件的bash脚本。其中一个要求是文件中必须只有一个“2”。

这是我目前的代码:

regex1="[0-9b]*2[0-9b]*2[0-9b]*"

# This regex will match if there are at least two 2's in the file
if [[ ( $(cat "$file") =~ $regex1 ) ]]; then
    # stuff to do when there's more than 1 "2"
fi

#...


regex2="^[013456789b]*$"
# This regex will match if there are at least no 2's in the file
if [[ ( $(cat "$file") =~ $regex2 ) ]]; then
    # stuff to do when there are no 2's
fi

我要做的是匹配以下部分:

654654654654
254654845845
845462888888

(因为那里有2个2,它应该匹配)

987886546548
546546546848
654684546548

(因为那里没有2,它应该匹配)

我知道如何使用=~运算符搜索所有行吗?

4 个答案:

答案 0 :(得分:2)

  

我正在尝试创建一个验证文件的bash脚本。其中一个   要求是文件中必须只有一个“2”。

尝试使用grep

#!/bin/bash

file='input.txt'

n=$(grep -o '2' "$file" | wc -l)
# echo $n

if [[ $n -eq 1 ]]; then
  echo 'Valid'
else
  echo 'Invalid'
fi

答案 1 :(得分:1)

这个怎么样:

twocount=$(tr -dc '2' input.txt | wc -c)
if (( twocount != 1 ))
then
  # there was either no 2, or more than one 2
else
  # exactly one 2
fi

答案 2 :(得分:0)

像往常一样使用锚点,匹配一串非2,一个2和另一个非2字符串。

^[^2]*2[^2]*$

答案 3 :(得分:0)

使用awk null record separator确实可以实现多行正则表达式匹配。

请考虑以下代码:

awk '$0 ~ /^.*2.*2/ || $0 ~ /^[013456789]*$/' RS= file
654654654654
254654845845
845462888888

注意RS=使得awk将多行连接到单行$0,直到它遇到双换行符。