在文件中使用 sed 插入存储在变量中的多行
Insert multiple lines stored in a variable using sed in a file
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/ [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/ [P]
## END apppush Rewrites --##
为了使用一个简单的例子来完成上面的操作,我尝试了下面的命令,它给了我一个错误。
例如: 我想将包含一些值(总共 3 行)的 ${var}
添加到第 3 行的 giga.txt 文件中。
$ 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 以获得所需的输出,但我试图看看 sed
或 awk
是否可以做到这一点 -- 或 --
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
不需要转义其换行符。
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/ [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/ [P]
## END apppush Rewrites --##
为了使用一个简单的例子来完成上面的操作,我尝试了下面的命令,它给了我一个错误。
例如: 我想将包含一些值(总共 3 行)的 ${var}
添加到第 3 行的 giga.txt 文件中。
$ 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 以获得所需的输出,但我试图看看 sed
或 awk
是否可以做到这一点 -- 或 --
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
不需要转义其换行符。