使用 sed 在文件中插入存储在变量中的多行

Aru*_*gal 6 linux sed in-place

乌班图14.04

我想将源文件中存储的几行插入到目标文件中。我将读取变量中的所有这些行$var,即如果我这样做,echo "${var}"它将给出以下输出 - 我想将其添加到我的 apache 配置文件中的给定行中。

我的确切源文件(又名${var})内容是:

        ## apppush proxying - get content from live site --##
        RewriteRule /apppush/hreflang/(.*) http://localhost:8081/hreflang.php?u=https://www.company.com/apppush/hreflang/$1 [P,L]

        RewriteCond /www/retaildb/companycom/us/branches/somebranch/us/%{SCRIPT_FILENAME} -d [OR]
        RewriteCond /www/retaildb/companycom/us/branches/somebranch/us/%{SCRIPT_FILENAME} -f
        RewriteRule ^/apppush/retail/(.*) /www/retaildb/companycom/us/branches/somebranch/us/%{SCRIPT_FILENAME} [L]

        ## Search/GIGA apppush rewrite
        RewriteCond %{DOCUMENT_ROOT}%{SCRIPT_FILENAME} !-f
        RewriteCond %{DOCUMENT_ROOT}%{SCRIPT_FILENAME} !-d
        RewriteRule ^/apppush/(.*)/search/(.*) /www/giga/%{SCRIPT_FILENAME} [L]

        RewriteRule /apppush/(.*) https://www.company.com/apppush/$1 [P]
        ## END apppush Rewrites --##
Run Code Online (Sandbox Code Playgroud)

为了使用简单的示例执行上述操作,我尝试了以下命令,这给了我一个错误。

例如:我想将${var}包含一些值(总共 3 行)的内容添加到 giga.txt 文件中的第 3 行。

$ cat giga.txt
1
2
3
4
5
$ var="$(echo -e "333-444-555\n444-555-666\n555-666-777")"
$ echo "${var}"
333-444-555
444-555-666
555-666-777
gigauser@re-gigadev-s03-dev-2-32-3-rno:~/SVN_WS/repos/shenziconf$
$ sed -i "3i${var}" giga.txt
sed: -e expression #1, char 18: unknown command: `-'
Run Code Online (Sandbox Code Playgroud)

我期望 giga.txt 文件中的输出为:

1
2
333-444-555
444-555-666
555-666-777
3
4
5
Run Code Online (Sandbox Code Playgroud)

最终目标是在 giga.txt(目标文件/apache 配置文件)的第 3 行插入源文件内容。

还有其他方法可以使用程序来选择行# 1st-to-N,添加源文件内容,然后行#s N+1 -to- EndOfFile 以获得所需的输出,但我试图看看是否可以sed这样awk做这个——或者——

PS例如:以下命令可以成功执行类似的操作(即在目标文件的给定位置插入从源文件中获取的行),但我正在寻找如何通过使用$var iable 来完成此操作(如果可能)。

sed -i "3r sourcefile.txt" targetfile.txt

Ben*_* W. 6

由于最终您想要从文件中读取而不是变量,因此您可以r直接使用该命令:它读取文件并将其插入到当前行之后。所以如果你giga.txt

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

source.txt

333-444-555
444-555-666
555-666-777
Run Code Online (Sandbox Code Playgroud)

你可以使用这个命令:

$ sed '2r source.txt' giga.txt            
1
2
333-444-555
444-555-666
555-666-777
3
4
5
Run Code Online (Sandbox Code Playgroud)

请注意,我已将行号更改为 2,因为在行r附加,而在行插入。i


如果你真的想从变量插入,你必须稍微准备一下:i要求换行符用 转义\,所以如果你这样做

var=$(sed '$!s/$/\\/' source.txt)
Run Code Online (Sandbox Code Playgroud)

你将有一个如下所示的变量:

$ echo "$var"
333-444-555\
444-555-666\
555-666-777
Run Code Online (Sandbox Code Playgroud)

你可以使用这个 sed 命令:

$ sed "3i$var" giga.txt 
1
2
333-444-555
444-555-666
555-666-777
3
4
5
Run Code Online (Sandbox Code Playgroud)

如果你有 GNU sed,你可以结合这两种方法(帽子提示Sundeep的评论): GNU sed 可以从特殊文件中读取标准输入/dev/stdin,所以你可以使用

sed '2r /dev/stdin' giga.txt <<< "$var"
Run Code Online (Sandbox Code Playgroud)

或者,如果您的 shell 不像 Bash 那样支持这里的字符串,

echo "$var" | sed '2r /dev/stdin' giga.txt
Run Code Online (Sandbox Code Playgroud)

where$var不需要转义换行符。