5

I'm trying to add a string at the end of all lines in a text file, but I have a mistake somewhere.

Example:

I've this in a text file:

begin--fr.a2dfp.net
begin--m.fr.a2dfp.net
begin--mfr.a2dfp.net
begin--ad.a8.net
begin--asy.a8ww.net
begin--abcstats.com
...

I run:

sed -i "s|\x0D$|--end|" file.txt

And I get:

begin--fr.a2dfp.net--end
begin--m.fr.a2dfp.net--end
begin--mfr.a2dfp.net--end
begin--ad.a8.net
begin--asy.a8ww.net--end
begin--abcstats.com
...

The string is added only in certain lines and not in others.

Any idea why?

kenorb
  • 26,615
rkifo
  • 53

3 Answers3

11

\x0D is carriage return, which may or may not be visible in your text editor. So if you've edited the file in both Windows and a Unix/Linux system there may be a mix of newlines. If you want to remove carriage returns reliably you should use dos2unix. If you really want to add text to the end of the line just use sed -i "s|$|--end|" file.txt.

l0b0
  • 7,453
4

There are may ways of doing this:

  1. Perl

    perl -i -pe 's/$/--end/' file.txt
    
  2. sed

    sed -i 's/$/--end/' file.txt
    
  3. awk

    awk '{$NF=$NF"--end"; print}' file.txt > foo && mv foo file.txt
    
  4. shell

    while IFS= read -r l; do 
     echo "$l""--end"; 
    done < file.txt > foo && mv foo file.txt
    
terdon
  • 54,564
0

You may try using ex:

ex +"%s/$/--end/g" -cwq foo.txt 

which is equivalent to vi -e.

Option -i isn't quite compatible between Linux and Unix and it may not be available on other operating systems.

kenorb
  • 26,615