1

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

4

5 回答 5

2

干得好:

#/bin/bash

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

在 Ubuntu 13.04 上的 bash 中对此进行了测试。

于 2013-05-16T20:55:40.130 回答
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"
于 2013-05-16T21:42:09.813 回答
1

Ubuntu 13.04 pcregrep比赛中测试b\na。grep的-m标志导致它在第一次匹配时退出。

until ./a.out | pcregrep -M 'b\na' | grep -m 1 a; do :; done
于 2013-05-16T21:12:37.800 回答
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
于 2013-05-16T21:38:57.603 回答
0

就像是

./a.out | sed '/^b$/!b;:l;n;/^b$/bl;/^a$/q'

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

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

于 2013-05-16T20:55:00.107 回答