如何在 osx bash 脚本中将回车符附加到替换文本

如何在 osx bash 脚本中将回车符附加到替换文本

我尝试过在这里搜索的许多答案,但出于某种原因,没有任何答案起作用

我有一个 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

相关内容