我尝试过在这里搜索的许多答案,但出于某种原因,没有任何答案起作用
我有一个 bash 脚本,我想用它来处理一系列文件。
这是一个简化的例子
一个 SQL 文件: foo.bar.用户.sql:
-- mysql script
一个 bash 脚本foo.sh它想要在 sql 文件的顶部插入一个“use”语句
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\'$'\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
跑步foo.sh这边走
foo.sh foo
我期望的目标是foo.bar.用户.sql最终结果如下:
use foo;
-- mysql script
到目前为止,我已经尝试了很多不同的建议,但都没有用,以下是我尝试过的方法和效果
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\'$'\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;'$'n-- mysql script
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\\$'\n'/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果
use foo;$'n'-- mysql script
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\\$'\\n'/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果
use foo;$'n'-- mysql script
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\\$\\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果
use foo;$n-- mysql script
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\$\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果
use foo;$n-- mysql script
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\'$'\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;'$'n-- mysql script
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\\\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;\n-- mysql script
脚本:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\\n/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;n-- mysql script
脚本:
db=$1
cr="\n"
cat foo.bar.users.sql | sed "1s/^/use $db;${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;n-- mysql script
脚本:
db=$1
cr="
"
cat foo.bar.users.sql | sed "1s/^/use $db;${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;^M-- mysql script
脚本:
db=$1
cr="$'\n'"
cat foo.bar.users.sql | sed "1s/^/use $db;${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;$'n'-- mysql script
脚本:
db=$1
cr="\n"
cat foo.bar.users.sql | sed "1s/^/use $db;\\${cr}/" > tmp.txt; mv tmp.txt foo.bar.users.sql
结果:
use foo;\n-- mysql script
欢迎提供任何线索
答案1
sed
非常适合在行内编辑,但不适合处理行尾。如果必须使用sed
,您可以插入一个未使用的字符(如“§”),然后tr
将其转换为 CR:
db=$1
cat foo.bar.users.sql | sed "1s/^/use $db;\\§/" | tr "§" "\n" > tmp.txt; mv tmp.txt foo.bar.users.sql
echo
但最简单的方法可能是结合和的输出cat
来创建前缀行:
db=$1
(
echo "use $db;"
cat foo.bar.users.sql
) > tmp.txt; mv tmp.txt foo.bar.users.sql