learnbyexample / learn_gnuawk

Example based guide to mastering GNU awk
https://learnbyexample.github.io/learn_gnuawk/
MIT License
1.07k stars 76 forks source link

Regular Expressions: Escape character #9

Open alexwheezy opened 1 month ago

alexwheezy commented 1 month ago

Hi, in the regular expressions chapter, I found an inaccuracy related to escaping characters in the incoming input.

Matching the metacharacters

$ echo '\learn\by\example' | awk '{gsub(/\\/, "/")} 1'
/learn/by/example

Using string literal as a regexp

# another example
$ echo '\learn\by\example' | awk '{gsub("\\\\", "/")} 1'
/learn/by/example
$ echo '\learn\by\example' | awk '{gsub(/\\/, "/")} 1'
/learn/by/example

In these examples, we don't escape the incoming text '\learn\\by\\example' with extra slashes and so echo returns the wrong string \learyample on pipe for awk.

learnbyexample commented 1 month ago

Backslashes are not special with default echo (at least on my system).

$ echo '\learn\by\example'
\learn\by\example

Your issue is probably mentioned in this thread: https://unix.stackexchange.com/questions/65803/why-is-printf-better-than-echo

Edit: That said, I just checked it from my TUI apps and I see the behavior as you mention. I'll look into it further or may be just use printf and avoid all the trouble.

alexwheezy commented 1 month ago

Okay, thanks for the answer. Btw, I see the same behavior with printf.

learnbyexample commented 1 month ago

Ah, I meant printf '\\learn\\by\\example\n' so that it'll behave the same everywhere, unlike echo that differs in how it handles backslashes based on the implementation.