Skip to content

Instantly share code, notes, and snippets.

@jfsiii
Created January 31, 2012 22:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jfsiii/1713447 to your computer and use it in GitHub Desktop.
Save jfsiii/1713447 to your computer and use it in GitHub Desktop.
No new line
## This works as I wish (append to EOL)
→ echo -n "foo bar baz" >> out; echo -n "EOL" >> out; cat out; rm out
foo bar bazEOL
## Q: What in this `sed` causing a new line?
→ echo -n "foo bar baz" | sed "s/ /\&/g" >> out; echo -n "EOL" >> out; cat out; rm out
foo&bar&baz
EOL
## A: `sed`.
## From the `sed` manpage: "Normally, sed cyclically copies a line of input, not including its terminating newline character, into a pattern space, (unless there is something left after a ``D'' function), applies all of the commands with addresses that select that pattern space, copies the pattern space to the standard output, appending a newline, and deletes the pattern space."
## I used a simple `awk` program to clean up after `sed`
## (`echo` text updated to be more representative of the actual input which identified the problem)
echo -n "outlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfj
outlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfj
outlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfj" \
| awk '{ORS=""; gsub("dfl", "REPLACEMENT"); if (NR!=1) print "\n"; print;}' >> out; \
echo -n "FINAL_CHARACTER" >> out; \
cat out; rm out;
@jfsiii
Copy link
Author

jfsiii commented Feb 1, 2012

The first echo example wasn't quite representative of the actual output. The actual output had newlines that I wanted to keep. It's only the last newline (the one added by sed) that I want to replace

echo -n "outlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfj

outlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfj

outlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfjoutlaksdjfl;aksjdfl;aksjdfl;kajsd;kdfjals;kdfjal;skjdf;laskjdfl;aksjdfl;kajsdfl;kajsdfl;kjas;ldfkjaslkdfjla;skjdfl;aksjdfl;aksjdfl;kasjdfl;kajsdf;lkajsd;flkjas;ldkfjas;lkdfja;lskdjf;alskdfj" \
| sed "s/dfl/REPLACEMENT/g" \
| awk '{ORS=""; if (NR==1) print; else print "\n" $0;}' >> out; \
echo -n "FINAL_CHARACTER" >> out; \
cat out; rm out;

awk was the answer.

I set the output record separator (ORS, normally \n) to an empty string (which would cause all the lines to run together).

Then, if it's the first line I print it (without the newline). For all others, I print a newline first then the line (without the newline).

That way, I can append to the end of the line as opposed to a new one

@jfsiii
Copy link
Author

jfsiii commented Feb 1, 2012

I just realized the awk program can be shortened to awk '{ORS=""; if (NR!=1) print "\n"; print;}'

Only print newlines (before the input line) for those lines greater than 1.

@jfsiii
Copy link
Author

jfsiii commented Feb 4, 2012

It turns out there's no reason to even call sed. If gsub("dfl", "REPLACEMENT"); is added to the awk program, the desired results are achieved using only one program.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment