Well, life unexpectedly intruded on my investigation of this matter, but 
needing the challenge of re-acquiring knowledge which I used to have at my 
fingertips decades ago, I have done the necessary due diligence and trawled 
the man pages and web and found a satisfactory solution which I thought 
should be shared here.

As I had already determined, BBEdit does not have access to file system 
variables during multi-file replacement operations from within the app.
>From seeing all the AppleScript related postings, I had assumed that this 
would be where I would need to research, and felt daunted by the task of 
acquiring sufficient knowledge to get to the point of even testing a 
solution.
Having been a un*x admin in another life, I felt that I would have quicker 
success with command-line tools like sed and awk, so I thought I'd start 
there.

Before even getting to step one, I ran into another issue in my first 
terminal session: traversing macOS style folder aliases in the shell!
After much binding in the marsh, it transpired that my long preferred tcsh 
shell was not going to cut the mustard without escaping backslashitis, so I 
would have to go with bash to be able to use function aliases and overload 
the builtin cd command to traverse finder aliases as it already does for 
symlinks.

See 
https://apple.stackexchange.com/questions/180762/how-to-go-to-alias-from-terminal

Once that hurdle was overcome, and I could at least traverse the folder 
tree to a place where I could test my filename insertion into the relevant 
text files, I ran into my next faulty assumption.
I had frequently used find as a sysadmin to perform selective backups and 
data transfers, but within the current directory, 'find . -type f -name 
"*.ext" -print' continued to give me a pesky preceding ./ on all the 
filenames, when what I needed the full, absolute path of each file to be 
inserted into it.
Research seemed to imply that I could define a shell function abspath() to 
make the conversion, when I stumbled on one of the later answers on the 
following page:

http://stackoverflow.com/questions/3915040/bash-fish-command-to-print-absolute-path-to-a-file

which points out that supplying an absolute path to find 'find $(pwd)', 
using the output of the shell command pwd (present working directory), 
gives absolute paths in the output, whereas 'find .' will always give 
relative paths, so an abspath function was redundant!
Great! Absolute paths to required files sorted. Next!

The stream editor sed, which I had thought to use for substitution (with 
the -E extended grep repertoire) was stubbornly line buffered, and the vast 
majority of the replacements I needed to make had patterns with multiple 
newlines, which it failed to match.

So, it's off to Perl land we go... and... huzzah! For best success, use a 
sewage pump!

#!/bin/bash
find "$PWD" -type f -name "*.cm2" -exec perl -0pi -e 
's|(\t\t\t\}\n\t\t\}\n)(\tcameraModel)|\1\tcustomData\n\t\t\{\n\t\tdata 
PoseName 1 0 "$ARGV"\n\t\t\}\n\2|' "{}" \;

The single-line shell command above is what I have come up with.
After traversing to the appropriate parent folder of all the files which 
need to be changed using cd (change directory), 
find will search the folder defined by the output of the builtin shell pwd 
command (which must be delimited with double-quotes as the folder names 
contain spaces),
for files ( -type f ) with names ending with .cm2 (again delimited as they 
will contain spaces) ( -name "*.cm2" )
each file found will have its absolute path passed to perl, both as the 
name of the file to be operated upon ( double-quote delimited "{}" ) and as 
$ARGV, a shell-variable argument component of the replacement string.
The perl command parameters tell perl to use a null character for buffering 
(equivalent to End Of File) rather than newlines and perform an inline 
replacement of the original file without backup (I have time machine 
backups)
Gratifyingly, the string substitution is formatted exactly as it would be 
in BBEdit, so I can test the search and replacements in-app before directly 
copying them into the script from the find dialog.

The script turns directories of files containing unique blocks like:

                        }
                }
        cameraModel poser

into:

                        }
                }
        customData
                {
                data PoseName 1 0 "/Volumes/HiggsBosonHD/Users/... 
.../Runtime/libraries/Camera/Face/CloseUp 51mm f16.cm2"
                }
        cameraModel poser

with each file containing its own absolute path reference.

-- 
This is the BBEdit Talk public discussion group. If you have a 
feature request or would like to report a problem, please email
"[email protected]" rather than posting to the group.
Follow @bbedit on Twitter: <http://www.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 post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/bbedit.

Reply via email to