Thank you very much, especially for the breakdown of what the different 
elements do. I've learned a few new tricks from this thread, so I'll be 
watching the group carefully in future. 

Victoria

On Friday, January 26, 2024 at 5:44:04 PM UTC Benjamin Irwin wrote:

> There are a couple of other options for search and replace.  SED and AWK 
> are designed specifically for that purpose.  The following is an example 
> taken from "tldr"; a great resource for helpful linux documentation and 
> examples. 
>
> *sed*
>
> Edit text in a scriptable manner. See also: awk, ed. More information: 
> https://www.gnu.org/software/sed/manual/sed.html.
>
>
>    - Replace all apple (basic regex) occurrences with mango (basic regex) 
>    in all input lines and print the result to stdout:
>
> {{command}} | sed 's/apple/mango/g'
>
>    - Replace all apple (extended regex) occurrences with APPLE (extended 
>    regex) in all input lines and print the result to stdout:
>
> {{command}} | sed -E 's/(apple)/\U\1/g'
>
>    - Replace all apple (basic regex) occurrences with mango (basic regex) 
>    in a specific file and overwrite the original file in place:
>
> sed -i 's/apple/mango/g' {{path/to/file}}
>
>    - Execute a specific script [f]ile and print the result to stdout:
>
> {{command}} | sed -f {{path/to/script.sed}}
>
>    - Print just the first line to stdout:
>
> {{command}} | sed -n '1p'
>
>    - [d]elete the first line of a file:
>
> sed -i 1d {{/path/to/file}}
>
>    - [i]nsert a new line at the first line of a file:
>
> sed -i '1i\your new line text\' {{/path/to/file}}
>
> On Friday, January 26, 2024 at 10:56:40 AM UTC-5 Neil Faiman wrote:
>
>> There may be a way of doing this with a single operation. Usually, when 
>> approaching a problem like this, I just find a find-and-replace that will 
>> do the job if applied repeatedly some smallish number of times.
>>
>> So, we’ll start out with a pattern that will leave the “hash-mark 
>> lowercase-string underscore” prefix intact as a marker, find the first 
>> subsequent uppercase letter in the fragment (if any), lowercase it, and 
>> insert the hyphen.
>>
>> Find: (?i)(href="[a-zA-Z/-]+\.x?html#)(?-i)([a-z]+?_[-a-z]*)([A-Z])
>>
>> Replace: \1\2-\l\3
>>
>>
>> Breaking this down:
>>
>>    - (?i) Means that the pattern is case-insensitive.
>>    - (href="[a-zA-Z/-]+\.x?html) matches (and captures) the initial part 
>>    of a link URL string (to make sure that we don’t inadvertently transform 
>>    arbitrary text in the document).
>>    - (?-i) switches the remainder of the pattern to case-sensitive.
>>    - (#[a-z]+?_[-a-z]*) matches and captures
>>       - A string of lowercase letters followed by an underscore
>>       - A possibly empty string of lowercase letters and hyphens.
>>    - ([A-Z]) matches and captures the first uppercase letter in the 
>>    fragment.
>>
>>
>> The replacement string consists of everything up to the uppercase letter 
>> unchanged; a hyphen; and the uppercase letter, lower-cased. (“\l” means 
>> “lower-case the next character in the replacement string.)
>>
>> If we apply this find-and replace to your example string
>>
>> <a href=
>> "/premium-classic/before-you-start.xhtml#sub_KeepingLightroomUpdated">Keeping
>>  
>> Lightroom Updated</a>
>>
>> We will get
>>
>> <a href=
>> "/premium-classic/before-you-start.xhtml#sub_-keepingLightroomUpdated">Keeping
>>  
>> Lightroom Updated</a>
>>
>> Applying it repeatedly, we get
>>
>> <a href=
>> "/premium-classic/before-you-start.xhtml#sub_-keeping-lightroom-updated">Keeping
>>  
>> Lightroom Updated</a>
>>
>> So you want to apply this with a  find-and-replace-all to the entire 
>> document repeatedly until it doesn’t do anything any more. (Since it’s a 
>> no-op if it doesn’t match anything, you could just apply it five, or ten, 
>> or twenty times — whatever seems like a reasonably upper limit on the 
>> number of words in the fragment.)
>>
>> Now we don’t need to marker any more, and we have an extra hyphen, so we 
>> will use a second pattern to clean that up:
>>
>> Find: (?i)(href="[a-zA-Z/-]+\.x?html#)(?-i)[a-z]+?_-
>>
>> Replace: \1
>>
>>
>> Do a find-and-replace-all, and this will remove the “lower-case-string 
>> underscore hyphen” from the start of each fragment:
>>
>>  <a href=
>> "/premium-classic/before-you-start.xhtml#keeping-lightroom-updated">Keeping 
>> Lightroom Updated</a>
>>
>> Regards,
>> Neil Faiman
>>
>> On Jan 26, 2024, at 6:06 AM, Victoria Bampton <
>> [email protected]> wrote:
>>
>> There's clearly lots of experience here... can anyone tell me if this is 
>> possible to do a find/replace GREP?
>>
>> Links like those following are spread throughout a series of documents. I 
>> need to change the bit after the hash (e.g., #sub_InstallingLightroom) to 
>> remove the chunk before the underscore, put a hyphen before each uppercase 
>> character, and change the uppercase to lowercase (e.g., it becomes 
>> #installing-lightroom). That could be multiple finds/replacements, as I can 
>> deal with some of it, but I'm getting stuck on targeting and transforming 
>> those uppercase characters. Is it doable? Any bright ideas would be greatly 
>> appreciated!
>>
>> <a 
>> href="/premium-classic/before-you-start.xhtml#sub_InstallingLightroom">Installing
>>  
>> Lightroom</a>
>> <a 
>> href="/premium-classic/before-you-start.xhtml#box_MultipleComputers">Multiple
>>  
>> Computers</a>
>>  <a 
>> href="/premium-classic/before-you-start.xhtml#sub_KeepingLightroomUpdated">Keeping
>>  
>> Lightroom Updated</a>
>> <a 
>> href="/premium-classic/managing-your-photos.xhtml#sub_ManagingFoldersInLightroomAndOnTheHardDrive">Managing
>>  
>> Folders in Lightroom and on the Hard Drive</a>
>> <a 
>> href="/premium-classic/managing-your-photos.xhtml#sub_ChangingTheFolderStructure">Changing
>>  
>> the Folder Structure</a> 
>>
>> -- 
>> This is the BBEdit Talk public discussion group. If you have a feature 
>> request or need technical support, please email "[email protected]" 
>> rather than posting here. Follow @bbedit on Twitter: <
>> https://twitter.com/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/f3743619-5c95-4161-8107-b81affbdd6dan%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/bbedit/f3743619-5c95-4161-8107-b81affbdd6dan%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>>

-- 
This is the BBEdit Talk public discussion group. If you have a feature request 
or need technical support, please email "[email protected]" rather than 
posting here. Follow @bbedit on Twitter: <https://twitter.com/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/6bb20c24-2ca5-4858-9774-a33465439112n%40googlegroups.com.

Reply via email to