我在input.txt文件中有以下字符串。
Running
isn't running
is running
Stopped
stopped
Aborted
aborted
在这里我需要匹配除" Running"之外的所有内容。和"正在运行"。到目前为止,我已经在下面做了,但似乎是打印" Running"并且"正在运行"同样。可以帮一下吗?
exec < input.txt
while read line
do
if [[ $line =~ [Aa]borted || [Ss]topped || isn*t ]]; then
echo "$line"
else
echo "FINE"
fi
done
答案 0 :(得分:1)
为什么不使用grep?
grep -v "unning" < input.txt
为您提供所需的线条。
答案 1 :(得分:0)
grep -vE '\<(R|is r)unning\>' input.txt
\<
和\>
标记是单词边界,因此您不会过滤掉“此运行”
在shell中
while IFS= read -r line; do
case $line in
*"Running"* | *"is running"*) echo FINE ;;
*) echo "$line" ;;
esac
done < input.txt
代码中存在问题:此行
[[ $line =~ [Aa]borted || [Ss]topped || isn*t ]]
等同于此
[[ $line =~ [Aa]borted ]] || [[ $line =~ [Ss]topped ]] || [[ $line =~ isn*t ]]
等同于此
[[ $line =~ [Aa]borted ]] || [[ -n "[Ss]topped" ]] || [[ -n "isn*t" ]]
因为“或”运算符||
的优先级高于正则表达式匹配运算符=~
由于最后2个条件始终为真,因此每行都会通过。
另请注意,您正在使用带有正则表达式匹配运算符的glob模式,因此[[ $line =~ isn*t ]]
与isn't
不匹配,它将与is
和t
匹配中间为零或更多n
。 (ist
,isnt
,isnnt
等)
你打算写这个
[[ $line == [Aa]borted || $line == [Ss]topped || $line == isn*t ]]
这是用案例简明写的mote:
case $line in
[Aa]borted | [Ss]topped | isn*t) echo "$line" ;;
*) echo FINE ;;
esac
这是我的答案的反面。