Already done grep, sed, coreutils, cli basics and more. See https://learnbyexample.github.io/learn_gnuawk/buy.html#book-list for links.
learnbyexample
Well, if you are comfortable with Python scripts, there's not much reason to switch to awk
. Unless perhaps you are equating awk
to Python as scripting languages instead of CLI usage (like grep
, sed
, cut
, etc) as my ebook focuses on. For example, if you have space separated columns of data, awk '{print $2}'
will give you just the second column (no need to write a script when a simple one-liner will do). This of course also allows you to integrate with shell features (like globs).
As a practical example, I use awk
to filter and process particular entries from financial data (which is in csv format). Just a case of easily arriving at a solution in a single line of code (which I then save it for future use).
I'll recommend some from the lesser known progression fantasy genre:
- Cradle by Will Wight
- Mage Errant by John Bierce
- Mother of Learning by Nobody103 (Domagoj Kurmaić)
- The Weirkey Chronicles by Sarah Lin
- Beware of Chicken by CasualFarmer
- Super Powereds by Drew Hayes
Not my site, just sharing a link I saw on HN.
Well, I'm not going to even try understanding the various features used in that sed
command. I do know how to use basic loops with labels, but I never bothered with all the buffer manipulation stuff. I'd rather use awk/perl/python for those cases.
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).
perl -pe 's/\[[^]]+\]\((?!https?)[^#]*#\K[^)]+(?=\))/lc $&=~s:%20|\d\K\.(?=\d):-:gr/ge'
Hmm, OP mentioned "Only edit what’s between parentheses" - don't see anywhere that whole URL shouldn't be changed...
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 ifhttp
orhttps
is found[^)]+(?=\))
match non)
characters and assert that)
is present after those characters$&=~s|%20|-|gr
change%20
to-
for the matching portion found, ther
flag is used to return the modified string instead of change$&
itselflc
is a function to change text to lowercase
GNU datamash (https://www.gnu.org/software/datamash/alternatives/) - handy tool for data munching. There's also https://github.com/BurntSushi/xsv
Check out my chapter on GNU grep BRE/ERE for those wanting to learn this regex flavor: https://learnbyexample.github.io/learn_gnugrep_ripgrep/breere-regular-expressions.html (there's also another chapter for PCRE)
Thanks a lot for the feedback :)