如何在满足单独条件时打破重复?

时间:2017-10-05 13:56:07

标签: text replace applescript repeat bbedit

想要提高我的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中,如何在重复循环中正确命名和增加文本?

1 个答案:

答案 0 :(得分: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