运行文件,直到输出与正则表达式匹配

时间:2013-05-16 20:45:02

标签: regex bash

我想编写一个运行文件“a.out”的bash表达式,直到文件的输出等于“b \ na”,其中“\ n”是换行符。

5 个答案:

答案 0 :(得分:2)

你走了:

#/bin/bash

a.out | while :
do
    read x
    read y
    [[ $x == 'b' && $y == 'a' ]]  && break
    echo $x $y
done

在Ubuntu 13.04上用bash测试过。

答案 1 :(得分:2)

这也可以帮助您量化结果:

let ab=0 ba=0
for (( i=0; i<1000; ++i )); do
  case "$(./a.out)" in
    $'a\nb') let ab+=1;;
    $'b\na') let ba+=1;;
  esac
done
echo "a\\nb: $ab times; b\\na: $ba times"

答案 2 :(得分:1)

Ubuntu 13.04上进行测试 pcregrep匹配b\na。 grep的-m标志使它在第一场比赛时退出。

until ./a.out | pcregrep -M 'b\na' | grep -m 1 a; do :; done

答案 3 :(得分:1)

这应该有效:

./a.out | while read line; do
    [[ $s == 1 && $line == 'a' ]] && break
    s=0 
    [[ $line == 'b' ]] && s=1 
done 

矫枉过正的方式:

mkfifo myfifo
./a.out > myfifo &
pp=$!
while read line; do
    [[ $s == 1 && $line == 'a' ]] && break
    s=0 
    [[ $line == 'b' ]] && s=1 
done < myfifo
kill $pp 
rm myfifo

答案 4 :(得分:0)

这样的东西
./a.out | sed '/^b$/!b;:l;n;/^b$/bl;/^a$/q'

翻译:如果当前输入行与^b$不匹配(行的开头,b,行尾),则从下一个输入行开始;否则,获取下一个输入行;只要我们得到另一个^b$,请继续阅读,否则,如果匹配^a$,请停止阅读并退出。

:l声明了一个标签,所以我们可以在while循环中返回某个地方。没有显式标签的b分支到脚本的末尾(然后从下一个输入行重新开始)。