[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

bug#30336: sed

From: Assaf Gordon
Subject: bug#30336: sed
Date: Sat, 3 Feb 2018 12:24:35 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0


On 2018-02-03 09:11 AM, Roger Adair wrote:
when I execute the following command:

$ sed 's/c$/7/g' test.data.asc

where the contents of test.data.asc is:

abc  abc

I get the following output:

abc  abc

Whereas I would expect the following:

abc  ab7

If I leave the $ out of the command "ab7 ab7" appears.

What am I doing wrong?  Many thanks for reading my email.

My immediate guess would be that the file has dos/mac line endings
(e.g. CRLF "\r\n" instead of just line-feed "\n").

You can test it by using 'file', like so:

  $ file test.data.sac
  test.data.asc: ASCII text, with CRLF line terminators

Or by printing it's content like so:

  $ od -tcz test.data.asc
  0000000   a   b   c       a   b   c  \r  \n      >abc  abc..<

If you see only "\r" in the output - the file has MAC line-endings.
If you see both "\r\n" - the file has dos/windows line endings.

In unix, GNU sed "$" only matches "\n", and "\r" is just another character.

Some ways to work-around it:
1. Use "dos2unix" or "mac2unix" on the file (simplest and recommend).

2. Use the following to strip "\r" from the file
(assuming it also has "\n"):

    cat test.data.asc \
        | tr -d '\r' \
        | sed 's/c$/7/g'

If the file has only "\r", convert them to "\n":

    cat test.data.asc \
        | tr '\r' '\n' \
        | sed 's/c$/7/g'

3. Add sed command to remove "\r" before doing the
other substitution:

   sed -e 's/\r$//g' -e 's/c$/7/g' test.data.asc

4. Or modify the regex itself to optionally match "\r":

   sed 's/c\r*$/7/g' test.data.asc


If none of the above work, and you suspect another problem,
please provide a small fragment of your input file so we can reproduce the issue.

 - assaf

reply via email to

[Prev in Thread] Current Thread [Next in Thread]