我想编写一个 bash 表达式来运行文件“a.out”,直到文件的输出等于“b\na”,其中“\n”是换行符。
问问题
131 次
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 回答