我正在尝试创建一个验证文件的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,它应该匹配)
我知道如何使用=~
运算符搜索所有行吗?
答案 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
,直到它遇到双换行符。