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

标签 linux sed in-place

Ubuntu 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 --##

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

例如:我想将包含一些值(总共 3 行)的 ${var} 添加到 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: `-'

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

1
2
333-444-555
444-555-666
555-666-777
3
4
5

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

还有其他方法可以使用程序选择第 1 行到第 N 行,添加源文件内容,然后第 N+1 行到 EndOfFile 以获得所需的输出,但我想看看是否sedawk 可以做到这一点——或者——

PS 例如:下面的命令可以成功地执行类似的操作(即在目标文件的给定位置插入从源文件中获取的行)但是我'我正在寻找如何通过使用 $variable(如果可能)来做到这一点。

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

最佳答案

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

1
2
3
4
5

source.txt

333-444-555
444-555-666
555-666-777

你可以使用这个命令:

$ sed '2r source.txt' giga.txt            
1
2
333-444-555
444-555-666
555-666-777
3
4
5

请注意,我已将行号更改为 2,因为 r 添加到该行之后,而 i 将插入 之前 行。


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

var=$(sed '$!s/$/\\/' source.txt)

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

$ echo "$var"
333-444-555\
444-555-666\
555-666-777

你可以使用这个 sed 命令:

$ sed "3i$var" giga.txt 
1
2
333-444-555
444-555-666
555-666-777
3
4
5

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

sed '2r /dev/stdin' giga.txt <<< "$var"

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

echo "$var" | sed '2r /dev/stdin' giga.txt

其中 $var 不需要转义其换行符。

关于linux - 在文件中使用 sed 插入存储在变量中的多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45578244/

相关文章:

Linux 薄荷 : install subversion 1. 7

linux - 尝试使用 shell 脚本查找我的机器所需的所有内核模块

linux - Linux 中一组文件中的 SED 替换

linux - 寻找删除当前行和前后一行并替换当前行的方法

regex - Sed:仅当标记与第一个字符串匹配时才转换为 xml 标记

solr - 如何在不更新整个文档的情况下进行 Solr Delta 导入?

linux - cp 命令在 azure devops 的构建管道中的 Bash 脚本中不起作用

c - 使用 fork 和 execvp 启动/停止/etc/init.d/中的服务不起作用

java - 使用递归的整数除法——以及其他一些有趣的限制

python - 应该使用哪个运算符(+ vs +=)来提高性能? (就地与不就地)