2013-05-16 84 views
1

我想編寫一個bash表達式來運行文件「a.out」,直到文件的輸出等於「b \ na」,其中「\ n」是一個新隊。運行文件,直到輸出與正則表達式匹配

+3

能否請您發佈策略你到目前爲止嘗試過嗎?你是否面臨任何具體問題? –

+0

我試圖運行「a.out」,它從main()中創建的線程中輸出main()和「b」中的「a」。大部分時間「b」都跟着「a」,但有時卻相反。你的戰略意味着什麼? – Slazer

+0

你想證明線程執行是否(爲了我們的實際目的)是異步的?只是谷歌它有足夠的證據在那裏(和倒黴的問答網站充斥着爲什麼這樣的問題充斥...) – tripleee

回答

2

在這裏你去:

#/bin/bash 

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

在bash測試了這個在Ubuntu 13.04。

+1

這將重新運行'prog'多次,直到輸出完全是這兩行(並且我會使用case來進行比較)。我的理解是程序應該繼續運行,直到輸出中出現這兩行爲止。 OP,請澄清? – tripleee

+0

我把這段代碼放在一個shell文件test.sh中並運行它。它一遍又一遍地輸出這行:「./sk.sh:line 6:prog:command not found」。我也有Ubuntu 13.04。 – Slazer

+0

我的不好。 'prog'就是你的'a.out'。我假設你想一遍又一遍地運行你的代碼。看看你對Rishabh Sagar的評論的解釋,似乎你想在輸出遵循這種模式時可能會終止進程('a.out')。我對麼? – unxnut

0

喜歡的東西

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

翻譯:如果當前輸入線不匹配^b$與下一個輸入行重新開始(線,B,線的端部的開頭);否則,取下一個輸入行;只要我們得到另一個^b$,繼續閱讀,否則,如果它匹配^a$,停止閱讀並退出。

:l聲明瞭一個標籤,所以我們有一個地方可以返回while循環。沒有顯式標籤的b分支到腳本的末尾(然後從下一個輸入行開始)。

+0

試圖在Ubuntu 13.04上運行它與此結果 「sed:-e表達式#1,字符22 :未知命令:'^'「 – Slazer

+0

抱歉,粗心編輯;在缺少的斜線中添加。 – tripleee

+0

現在每次執行時都會輸出「a \ nb」。我希望它一遍又一遍地運行a.out,直到輸出「b \ na」。 – Slazer

1

測試Ubuntu 13.04 pcregrep匹配b\na-m標誌爲grep會導致它在第一次匹配時退出。

until ./a.out | pcregrep -M 'b\na' | grep -m 1 a; do :; done 
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 
+0

是的,這個非矯枉過正的版本似乎工作。 – Slazer

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" 
+0

哇,這太好了,謝謝。我沒有想到對它進行量化。這種方式更具有示範性。 – Slazer

+0

+1,不錯的綜合!對於它的價值,'case'很好(太),因爲你不需要引用你打開的表達式,但是雙引號當然是無害的。 – tripleee