sed

How can I replace each newline (\n) with a space using sed?


How can I replace a newline ("\n") with a space ("") using the sed command?

I unsuccessfully tried:

sed 's#\n# #g' file
sed 's#^$# #g' file

How do I fix it?


Solution

  • Use this solution with GNU sed:

    sed ':a;N;$!ba;s/\n/ /g' file
    

    This will read the whole file in a loop (':a;N;$!ba), then replaces the newline(s) with a space (s/\n/ /g). Additional substitutions can be simply appended if needed.

    Explanation:

    1. sed starts by reading the first line excluding the newline into the pattern space.
    2. Create a label via :a.
    3. Append a newline and next line to the pattern space via N.
    4. If we are before the last line, branch to the created label $!ba ($! means not to do it on the last line. This is necessary to avoid executing N again, which would terminate the script if there is no more input!).
    5. Finally the substitution replaces every newline with a space on the pattern space (which is the whole file).

    Here is cross-platform compatible syntax which works with BSD and OS X's sed (as per @Benjie comment):

    sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file
    

    As you can see, using sed for this otherwise simple problem is problematic. For a simpler and adequate solution see this answer.