Interests: Regular Expressions, Linux CLI one-liners, Scripting Languages and Vim
Here’s a solution with perl
(assuming you don’t want to change http/https after the start of (
instead of start of a line):
perl -pe 's/\[[^]]+\]\(\K(?!https?)[^)]+(?=\))/lc $&=~s|%20|-|gr/ge' ip.txt
e
flag allows you to use Perl code in the substitution portion.\[[^]]+\]\(\K
match square brackets and use \K
to mark the start of matching portion (text before that won’t be part of $&
)(?!https?)
don’t match if http
or https
is found[^)]+(?=\))
match non )
characters and assert that )
is present after those characters$&=~s|%20|-|gr
change %20
to -
for the matching portion found, the r
flag is used to return the modified string instead of change $&
itselflc
is a function to change text to lowercase
This might work, but I think it is best to not tinker further if you already have a working script (especially one that you understand and can modify further if needed).