我想编写一个运行文件“a.out”的bash表达式,直到文件的输出等于“b \ na”,其中“\ n”是换行符。
答案 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
分支到脚本的末尾(然后从下一个输入行重新开始)。