Alex Darsonik
Alex Darsonik

Reputation: 587

Using sed to convert text file to a C string

I would like to use sed to replace newlines, tabs, quotes and backslashes in a text file to use it as char constant in C, but I'm lost at the start. It would be nice to maintain the newlines also in the output, adding a '\n', then a double quote to close the text line, a crlf, and another double quote to reopen the line, for example:

line1

line2

would become

"line1\n"

"line2\n"

Can anybody at least point me in the right direction? Thanks

Upvotes: 6

Views: 1776

Answers (3)

Nicholas Wilson
Nicholas Wilson

Reputation: 9685

Better still:

'"'`printf %s "$your_text" | sed -n -e 'H;$!b' -e 'x;s/\\/\\\\/g;s/"/\\"/g;s/    /\\t/g;s/^\n//;s/\n/\\n" \n "/g;p'`'"'

Unlike the one above, this handles newlines correctly as well. I'd just about call it a one-liner.

Upvotes: 1

xcramps
xcramps

Reputation: 1213

In Perl, file input from stdin, out to stdout. Hexifies, so no worries about escaping stuff. Doesn't remove tabs, etc. Output is a static C string.

use strict;
use warnings;

my @c = <STDIN>;

print "static char* c_str = {\n";
foreach (@c) {
    my @s = split('');
    print qq(\t");
    printf("\\x%02x", ord($_)) foreach @s;
    print qq("\n);
}
print "};\n";

Upvotes: -1

Alnitak
Alnitak

Reputation: 339816

Try this as a sed command file:

s/\\/\\\\/g
s/"/\\"/g
s/  /\\t/g
s/^/"/
s/$/\\n"/

NB: there's an embedded tab in the third line, if using vi insert by pressing ^v <tab>

  1. s/\\/\\\\/g - escape back slashes
  2. s/"/\\"/g - escape quotes
  3. s/ /\\t/g - convert tabs
  4. s/^/"/ - prepend quote
  5. s/$/\\n"/ - append \n and quote

Upvotes: 10

Related Questions