Thank you very much for your help Neil! Great solution to my problem and thanks also for the detailed explanation.
- Marco. On Thursday, October 17, 2024 at 8:00:07 PM UTC+2 Neil Faiman wrote: > On Oct 17, 2024, at 6:14 AM, mrcmrc <[email protected]> wrote: > > > Hi all, I would need help writing a Grep syntax to change a string of text > like this: > > *House, Big Apple, Today, Movie* > > into this: > > *[[House]] | [[Big Apple]] | [[Today]] | [[Movie]]* > > > Below is a solution which will do *almost* exactly what you want. > > *Almost *exactly, because it will give you > > > [[House]]|[[Big Apple]]|[[Today]]|[[Movie]]| > > > Note the extra vertical bar at the end of the line. The simplest thing is > to follow up this up by removing the trailing vertical bars with > > Find:|$ > > Replace: *(nothing)* > > A BBEdit text factory makes it simple to automate doing two or more > find-and-replaces . > > The problem is that you want to change every “fragment” in a line to > “[[fragment]]|” except for the last fragment, which you want to change to > “[[fragment]]”, and there is no way to write a single regular expression > find-and-replace that has chooses among different replacement patterns > based on the content or context of the matched pattern. > > > Your example leaves a lot of details unspecified. Here are the assumption > my solution makes about exactly what you want: > > > - Divide each text line into fragments. > - Each fragment is a string of text (possibly empty) that does not > contain any commas, and that does not have any leading or trailing > spaces. > - Adjacent fragments are separated by a comma which might have > spaces on either side. > - Spaces at the beginning or end of the line or around a comma are > ignored. > - Put double square brackets around each fragment and vertical bars > between the bracketed fragments. > - Discard the comma/space separators and leading and trailing spaces. > > > If that is what you wanted, this pattern will do the job: > > Find: (?x) (?# 1: Leading space) [ ]* (?# 2: Fragment) ([^\n,]*?) (?# 3: > trailing space) [ ]* (?# 4: separator) (?:,|(\n)) > > Replace: [[\1]]|\2 > > > It works like this: > > 1. The leading space component [ ]* matches spaces before the pattern, > but doesn’t include them in the fragment. (This will only match at the > start of a line.) > 2. The capture group ([^\n,]*?) defines the actual fragments. It > matches a string of characters which are not commas or end-of-lines. Note > the use of the non-greedy repetition operator *?. This means that the > fragment is the *shortest* string which matches this sub-pattern, > while still allowing the remainder of the pattern to match. Trailing > spaces > will be matched by component 3 below but won’t be included in the fragment. > 3. The trailing space component [ ]* matches spaces after the > fragment, but doesn’t include them in the fragment. > 4. The separator component (?:,|(\n)) matches either a comma separator > or the end of the line. > - Note the use of (?:…), which means that these are “grouping” > parentheses, not “capturing” parentheses. The separator is part of the > pattern, but it isn’t part of the fragment. > - The new-line character is enclosed in *capturing* parentheses. > This means that the pattern match for the last fragment in a line > captures > the new-line as capture group 2 (which is otherwise empty), and the > \2 at the end of the replacement causes the newline to be included > following the fragment in the replacement string. > > > A find-and-replace-all should match the entire text of the input line. The > replacement contains each captured fragment, enclosed in doubled square > brackets and a trailing vertical bar, and with the captured new-line at the > end of the replacement for the last fragment. > > > > -- This is the BBEdit Talk public discussion group. If you have a feature request or believe that the application isn't working correctly, please email "[email protected]" rather than posting here. Follow @bbedit on Mastodon: <https://mastodon.social/@bbedit> --- You received this message because you are subscribed to the Google Groups "BBEdit Talk" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/bbedit/6d68d7fb-c77f-42e6-a416-1479b76ca8den%40googlegroups.com.
