44

Perhaps easiest to explain with an example:

$ echo '\&|'
\&|
$ echo '\&|' | while read in; do echo "$in"; done
&|

It seems that the read command is interpreting the backslashes in the input as escapes and is removing them. I need to process a file line by line without changing its contents and I'm not sure how to stop read from being smart here. Any ideas?

1

2 Answers 2

65

Accrding to: http://www.vias.org/linux-knowhow/bbg_sect_08_02_01.html :

-r
If this option is given, backslash does not act as an escape character. The backslash is considered to be part of the line. In particular, a backslash-newline pair may not be used as a line continuation.

It works on my machine.

$ echo '\&|' | while read -r in; do echo "$in"; done
\&|
Sign up to request clarification or add additional context in comments.

5 Comments

Awesome, thanks! I feel dumb for not having found the documentation for this, but it's one of those things that's hard to search for because the terms are rather generic :(
Btw, what shell are you using that does not require the -r? I'm using bash.
Watch out that this is not exactly true for read on zsh: documentation of built-in commands. Difference: -r just prints '\' if it is at the end of the line. So read -r in && echo $in will echo two lines if you enter foo\nbar
@normanius the difference is not in read, it's in echo - the zsh built in echo converts escape sequences like \n by default, whereas the bash built in you have to opt in to escape processing with echo -e
Indeed, what Ian says. I propose to change the solution to use printf "%s\n" "$in" which make it work with non-bash shells - I ran into this with dash.
7

Use read -r, as per http://www.ss64.com/bash/read.html:

-r
If this option is given, backslash does not act as an escape character.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.