Discussion:
Escaping grep
(too old to reply)
Michael F. Stemper
2021-02-21 21:35:55 UTC
Permalink
I wanted to see which LaTeX packages I was using for a particular
project, so I did:

***@host$ grep -h "\\usep" *tex | sort | uniq
% \usepackage{array} % for math mode columns in tabular
% \usepackage{graphicx}
% \usepackage{longtable}
% \usepackage{mathrsfs} % for mathscr
% \usepackage{tikz-cd} % for commutative diagrams
\usepackage{amsmath} % for implication and align*
\usepackage{amssymb} % for black-board set names
\usepackage{fancyhdr}
\usepackage{geometry}
\usepackage{parskip}
***@host$

However, that showed unused packages as well. So I tried
anchoring my grep to the beginning of the line, and got:

***@host$ grep -h "^\\usep" *tex | sort | uniq
***@host$

Why isn't this working? What am I overlooking? How
should I have said it?
--
Michael F. Stemper
The name of the story is "A Sound of Thunder".
It was written by Ray Bradbury. You're welcome.
Lewis
2021-02-22 06:36:57 UTC
Permalink
This is a grep question, not a bash question.

You need to use egrep or grep -E if you want to use ^ I believe.
--
"Are you pondering what I'm pondering?"
"I think so, Brain! But do I have what it take to be the 'Lord of the
Dance'?"
bodiccea
2021-04-17 13:36:19 UTC
Permalink
On Sun, 21 Feb 2021 15:35:55 -0600, "Michael F. Stemper"
Post by Michael F. Stemper
I wanted to see which LaTeX packages I was using for a particular
% \usepackage{array} % for math mode columns in tabular
% \usepackage{graphicx}
% \usepackage{longtable}
% \usepackage{mathrsfs} % for mathscr
% \usepackage{tikz-cd} % for commutative diagrams
\usepackage{amsmath} % for implication and align*
\usepackage{amssymb} % for black-board set names
\usepackage{fancyhdr}
\usepackage{geometry}
\usepackage{parskip}
However, that showed unused packages as well. So I tried
Why isn't this working? What am I overlooking? How
should I have said it?
There is no issue with the grep expression itself. The problem is
with bash handling of strings: You use " (double quotes) around
your expression, asking bash to interpret the contents.

bash will replace "^\\usep" with "^\usep" *before passing it to grep*.
grep then will remove special meaning for following char (u) - no
special meaning in this case.
The result is that grep will just look for lines starting with "u".

You have 2 solutions:
1) use quotes instead of double quotes: '^\\usep', so that bash does
not change anything.
2) using double quotes, force bash to preserve 2 backslash with the
string "^\\\\usep"

Sorry for late answer, I just joined this group.

And yes, it is a pure 'bash' question, not a 'grep' question as I saw in
another answer :)

bodi.
bodiccea
2021-04-17 15:58:37 UTC
Permalink
Post by bodiccea
1) use quotes instead of double quotes: '^\\usep', so that bash does
not change anything.
2) using double quotes, force bash to preserve 2 backslash with the
string "^\\\\usep"
As a general rule, when you are unsure about "real" strings sent to a
program (like grep in your case), you can always test them with printf,
I do it sometimes with complicated patterns.

Examples:
# your initial string
$ printf "%s\n" "^\\usep"
^\usep <-- passed to grep, incorrect

# with quotes
***@lorien:~/.claws-mail$ printf "%s\n" "^\\\\usep"
^\\usep <-- passed to grep, correct

# with double quotes
***@lorien:~/.claws-mail$ printf "%s\n" '^\\usep'
^\\usep <-- passed to grep, correct

bodi.
Michael F. Stemper
2021-04-17 16:08:36 UTC
Permalink
Post by bodiccea
Post by bodiccea
1) use quotes instead of double quotes: '^\\usep', so that bash does
not change anything.
2) using double quotes, force bash to preserve 2 backslash with the
string "^\\\\usep"
As a general rule, when you are unsure about "real" strings sent to a
program (like grep in your case), you can always test them with printf,
I do it sometimes with complicated patterns.
# your initial string
$ printf "%s\n" "^\\usep"
^\usep <-- passed to grep, incorrect
# with quotes
^\\usep <-- passed to grep, correct
# with double quotes
^\\usep <-- passed to grep, correct
That's a really good idea. Thanks for the pro-tip. (But I think
that your last comment has a typo.)
--
Michael F. Stemper
Outside of a dog, a book is man's best friend.
Inside of a dog, it's too dark to read.
bodiccea
2021-04-17 17:21:27 UTC
Permalink
On Sat, 17 Apr 2021 11:08:36 -0500, "Michael F. Stemper"
Post by Michael F. Stemper
Post by bodiccea
# with quotes
^\\usep <-- passed to grep, correct
# with double quotes
^\\usep <-- passed to grep, correct
That's a really good idea. Thanks for the pro-tip. (But I think
that your last comment has a typo.)
indeed, the 2 comments are messed up :*)
--
Dragons Don't Believe In You Either.
Michael F. Stemper
2021-04-17 16:06:34 UTC
Permalink
Post by bodiccea
On Sun, 21 Feb 2021 15:35:55 -0600, "Michael F. Stemper"
Post by Michael F. Stemper
I wanted to see which LaTeX packages I was using for a particular
% \usepackage{array} % for math mode columns in tabular
% \usepackage{graphicx}
% \usepackage{longtable}
% \usepackage{mathrsfs} % for mathscr
% \usepackage{tikz-cd} % for commutative diagrams
\usepackage{amsmath} % for implication and align*
\usepackage{amssymb} % for black-board set names
\usepackage{fancyhdr}
\usepackage{geometry}
\usepackage{parskip}
However, that showed unused packages as well. So I tried
Why isn't this working? What am I overlooking? How
should I have said it?
There is no issue with the grep expression itself. The problem is
with bash handling of strings: You use " (double quotes) around
your expression, asking bash to interpret the contents.
bash will replace "^\\usep" with "^\usep" *before passing it to grep*.
grep then will remove special meaning for following char (u) - no
special meaning in this case.
The result is that grep will just look for lines starting with "u".
Thank you. I've been using various *IX variants for three decades now
and I still can't get the single-quote v double-quote distinction
through my head.
Post by bodiccea
1) use quotes instead of double quotes: '^\\usep', so that bash does
not change anything.
Works fine, lasts a long time!
Post by bodiccea
Sorry for late answer, I just joined this group.
And yes, it is a pure 'bash' question, not a 'grep' question as I saw in
another answer :)
Thought so!
--
Michael F. Stemper
Outside of a dog, a book is man's best friend.
Inside of a dog, it's too dark to read.
Loading...