当满足单独的条件时,如何打破重复?
How can you break a repeat when a separate condition is met?
想要提高我的 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 中,如何正确命名和递增重复循环中的文本?
一个解决方案,脚本需要获取所有客户而不是一次获取一个客户。
之后,使用两个顾客之间的线来查找早餐项目。
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
另一种解决方案,使用find命令得到两个客户
之后,使用这两个客户之间的线来查找早餐项目。
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
想要提高我的 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 中,如何正确命名和递增重复循环中的文本?
一个解决方案,脚本需要获取所有客户而不是一次获取一个客户。
之后,使用两个顾客之间的线来查找早餐项目。
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
另一种解决方案,使用find命令得到两个客户
之后,使用这两个客户之间的线来查找早餐项目。
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