I've tried numerous answers that I searched for here, and for some reason nothing is working
I have a bash script which I'd like to use to process a series of files.
Here's a simplified example
a sql file: foo.bar.users.sql:
-- mysql script
a bash script foo.sh which wants to insert a "use" statement at the top of the sql file
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\'$'\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
running foo.sh this way
foo.sh foo
My desired goal is for foo.bar.users.sql to wind up like this:
use foo;
-- mysql script
I've tried so many variations of advice found so far, nothing works, here is what I've tried and what it does
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\'$'\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;'$'n-- mysql script
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\\$'\n'/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result
use foo;$'n'-- mysql script
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\\$'\\n'/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result
use foo;$'n'-- mysql script
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\\$\\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result
use foo;$n-- mysql script
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\$\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result
use foo;$n-- mysql script
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\'$'\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;'$'n-- mysql script
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\\\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;\n-- mysql script
script:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;n-- mysql script
script:
db=1ドル
cr="\n"
cat foo.bar.users.sql | sed "1s/^/use $db;${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;n-- mysql script
script:
db=1ドル
cr="
"
cat foo.bar.users.sql | sed "1s/^/use $db;${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;^M-- mysql script
script:
db=1ドル
cr="$'\n'"
cat foo.bar.users.sql | sed "1s/^/use $db;${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;$'n'-- mysql script
script:
db=1ドル
cr="\n"
cat foo.bar.users.sql | sed "1s/^/use $db;\\${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
result:
use foo;\n-- mysql script
Any clues welcomed
1 Answer 1
sed is great for editing within lines, but bad at working with line ends. If you must use sed, you could insert an unused character (like "§") and transform it into a CR later:
db=1ドル
cat foo.bar.users.sql | sed "1s/^/use $db;\\§/" | tr "§" "\n" > tmp.txt; mv tmp.txt foo.bar.users.sql
but the easiest way might be to combine the output of echo and cat in order to create the prefix line:
db=1ドル
(
echo "use $db;"
cat foo.bar.users.sql
) > tmp.txt; mv tmp.txt foo.bar.users.sql
-
OMG, that tr hack is horrible. I love it!carveone– carveone2021年05月14日 21:39:19 +00:00Commented May 14, 2021 at 21:39
-
You're right I was fixated on using sed. love this answer, thanks!slashdottir– slashdottir2021年05月14日 21:41:34 +00:00Commented May 14, 2021 at 21:41
-
1@slashdottir I admire your systematic approach with
sedthough; did the same thing at the time :)jvb– jvb2021年05月15日 08:02:12 +00:00Commented May 15, 2021 at 8:02
nl=$'\n'in the script. I believe what you did withcr="<return>"is POSIX but when I looked it up, the example used single quotes. Getting ^M made me laugh out loud, sorry...