2017-10-05 81 views
0

希望增加我的AppleScript的能力和我的repeat我很好奇的使用情況,知道我怎麼可以通過一個文本文件步驟來操作的內容,但我卡在什麼傳遞給打破循環,當我遇到另一名跑。當滿足單獨的條件時,如何打破重複?

鑑於然後文本文件的內容:

Bob 
- bacon 
- eggs 
- waffle 
Bacon ipsum dolor amet bresaola andouille flank, meatloaf salami biltong brisket. 
James 
- sausage 
- omelet 
Sausage short ribs sirloin landjaeger, biltong swine kielbasa prosciutto. 
Bresaola landjaeger jowl alcatra. 
Michael 
- scrambled eggs 
- cereal 
- toast 
Sam 
- sausage 
- pancakes 

我想我的輸出類似於:

Bob 
    1. Bob likes bacon 
    2. Bob likes eggs 
    3. Bob likes waffle 
Bacon ipsum dolor amet bresaola andouille flank, meatloaf salami biltong brisket. 
James 
    1. James likes sausage 
    2. James likes omelet 
Sausage short ribs sirloin landjaeger, biltong swine kielbasa prosciutto. 
Bresaola landjaeger jowl alcatra. 
Michael 
    1. Michael likes scrambled eggs 
    2. Michael likes cereal 
    3. Michael likes toast 
Sam 
    1. Sam likes sausage 
    2. Sam likes pancakes 

但是當我通過,我能找到的第一個名稱的文字腳本和虛線項目,但我有一個問題,試圖找出如何當另一個名字是如何打破:

該代碼:

tell application "BBEdit" 
    activate 
    set testCase to "repeatBreakfast.txt" 
    select insertion point before first character of text document testCase 
    set foodCount to 1 
    repeat 
     set theCustomer to find "^([A-Za-z]*)$" searching in text 1 of text document testCase options {search mode:grep, wrap around:false} with selecting match 
     if theCustomer is not found then 
      exit repeat 
     else 
      set theName to (grep substitution of "\\1") as string 
      repeat 
       set breakfastItem to find "^- (?=\\D)" searching in text 1 of text document testCase options {search mode:grep, wrap around:false} with selecting match 
       if breakfastItem is not found then 
        exit repeat 
       else 
        replace selection using ("\\t" & foodCount & ". " & theName & " likes ") 
        set foodCount to foodCount + 1 
       end if 
      end repeat 
     end if 
    end repeat 
end tell 

我得到:

Bob 
    1. Bob likes Bob likes bacon 
    2. Bob likes Bob likes eggs 
    3. Bob likes Bob likes waffle 
Bacon ipsum dolor amet bresaola andouille flank, meatloaf salami biltong brisket. 
James 
    4. Bob likes James likes sausage 
    5. Bob likes James likes omelet 
Sausage short ribs sirloin landjaeger, biltong swine kielbasa prosciutto. 
Bresaola landjaeger jowl alcatra. 
Michael 
    6. Bob likes Michael scrambled eggs 
    7. Bob likes Michael cereal 
    8. Bob likes Michael toast 
Sam 
    9. Bob likes sausage 
    10. Bob likes pancakes 

,但是當我嘗試插入條件下一個名稱:

if theCustomer is found then 
    set foodCount to 1 
    exit repeat 
end if 

我得到:

Bob 
    1. Bob likes Bob likes bacon 
- Bob likes eggs 
- Bob likes waffle 
Bacon ipsum dolor amet bresaola andouille flank, meatloaf salami biltong brisket. 
James 
    1. James likes James likes sausage 
- James likes omelet 
Sausage short ribs sirloin landjaeger, biltong swine kielbasa prosciutto. 
Bresaola landjaeger jowl alcatra. 
Michael 
    1. Michael likes Michael scrambled eggs 
- Michael cereal 
- Michael toast 
Sam 
    1. Sam likes sausage 
- pancakes 

在的AppleScript和BBEdit如何正確地命名和增加我的重複中的文本在循環?

回答

0

解決方案中,腳本需要一次獲取所有客戶而不是一個客戶。

之後,使用兩個客戶之間的線路查找早餐的項目。

tell application "BBEdit" 
    activate 
    set testCase to "repeatBreakfast.txt" 
    set r to find "^([A-Za-z]*)$" searching in text document testCase options {search mode:grep, wrap around:false, starting at top:true, returning results:true, showing results:false} 
    if r is found then 
     set allCustomers to found matches of r 
     set theCount to count allCustomers 
     repeat with i from 1 to theCount 
      set theCustomer to item i of allCustomers 
      set theName to match_string of theCustomer 
      set lineOfThisCustomer to result_line of theCustomer 
      if i < theCount then 
       set lastLineOfThisCustomer to (result_line of item (i + 1) of allCustomers) - 1 -- the line before the next customer 
      else 
       set lastLineOfThisCustomer to -1 -- it's the last customer, so use the last line of the document 
      end if 

      set foodCount to 1 
      repeat 
       -- ** search between this customer and the next customer ** 
       set breakfastItem to find "^- (?=\\D)" searching in (lines lineOfThisCustomer thru lastLineOfThisCustomer of text document testCase) options {search mode:grep, wrap around:false} with selecting match 
       if breakfastItem is not found then exit repeat 
       replace selection using ("\\t" & foodCount & ". " & theName & " likes ") 
       set foodCount to foodCount + 1 
      end repeat 
     end repeat 
    end if 
end tell 

另一種解決方案,使用找到命令來獲得兩個客戶。

之後,使用這兩個客戶之間的線路查找早餐的項目。

tell application "BBEdit" 
    activate 
    set testCase to "repeatBreakfast.txt" 
    select insertion point before first character of text document testCase 

    set theCustomer to find "^([A-Za-z]*)$" searching in text document testCase options {search mode:grep, wrap around:false} with selecting match 
    if theCustomer is found then 
     set theName to (grep substitution of "\\1") as string 
     repeat 
      set lineOfThisCustomer to startLine of found object of theCustomer 

      set theNextCustomer to find "^([A-Za-z]*)$" searching in text document testCase options {search mode:grep, wrap around:false} with selecting match 
      if theNextCustomer is found then 
       set lastLineOfThisCustomer to (startLine of found object of theNextCustomer) - 1 -- the line before the next customer 
       set theName2 to (grep substitution of "\\1") as string 
      else 
       set lastLineOfThisCustomer to -1 -- no other customer, so use the last line of the document 
      end if 

      set foodCount to 1 
      repeat 
       -- ** search between this customer and the next customer ** 
       set breakfastItem to find "^- (?=\\D)" searching in (lines lineOfThisCustomer thru lastLineOfThisCustomer of text document testCase) options {search mode:grep, wrap around:false} with selecting match 
       if breakfastItem is not found then exit repeat 
       replace selection using ("\\t" & foodCount & ". " & theName & " likes ") 
       set foodCount to foodCount + 1 
      end repeat 
      if theNextCustomer is not found then exit repeat 
      set theCustomer to theNextCustomer 
      set theName to theName2 
     end repeat 
    end if 
end tell