1

ファイルの出力が「b\na」と等しくなるまでファイル「a.out」を実行する bash 式を書きたいと思います。「\n」は改行です。

4

5 に答える 5

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 に答える
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 に答える
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 に答える