在循环中使用sed命令

时间:2018-03-15 04:18:42

标签: sed

#!bin/bash
file=txt.cfg
v4=45frsgf
n=24
ng=23jhjghg
for i in {1..3}
do
if ( $i == 3 );then 
    sed -i 's/host=.*/host = (\n(0x'$v4',0,'$n',0x'$ng',1,))/' $file
else
sed -i 's/host=.*/host = (\n(0x'$v4',0,'$n',0x'$ng',1,)),/' $file
done

在追加我的文件中会得到类似的内容..实际输出

45frsgf,0,24,23jhjghg
45frsgf,0,24,23jhjghg,
45frsgf,0,24,23jhjghg,

预计输出:

45frsgf,0,24,23jhjghg,
45frsgf,0,24,23jhjghg,
45frsgf,0,24,23jhjghgif

我运行一个循环然后添加它不应该添加的最后一行,并且该行应该是最后一行而不是第一行。

怎么做?

2 个答案:

答案 0 :(得分:2)

sed脚本包含以下格式的编辑命令:

[address[,address]]function

其中function表示Editing Commands in sed中列表中的单字符命令动词,后跟任何适用的参数。

该命令前面可以加<blank>个字符和/或<semicolon>个字符。该函数可以以<blank>个字符开头。这些可选字符无效。

基本上,sed脚本可以用单行写成

    [address[,address]]function;[address[,address]]function;...

或以多行形式

[address[,address]]function
[address[,address]]function
...

您实现的功能是s/BRE/replacement/flags形式的替代功能,其中您的替换包含多行。并且sed无法将此解释为单个命令。你写道:

s/vtemp =.*/vtemp = (

                (0'$v',0,'$n',0x'$g',1,))/

sed将此视为两个单独的命令

s/vtemp =.*/vtemp = (
(0'$v',0,'$n',0x'$g',1,))/

第一个命令语法无效(因此错误)。第二个命令也有无效的systax(顺便说一句。注意我删除了前导空格,因为sed没有解释那些!)

如果您想使用换行符进行替换,则应使用\n表示换行符。因此

s/vtemp =.*/vtemp = (\n\n                (0'$v',0,'$n',0x'$g',1,))/

答案 1 :(得分:0)

使用“\ n”表示换行符:

sed -r -i 's/vtemp =.*/vtemp = (\n\n\n                (0'$v',0,'$n',0x'$g',1,))/' $file

如果对引号使用双引号,则不需要内引号:

sed -r -i "s/vtemp =.*/vtemp = (\n\n\n                (0$v,0,$n,0x$g,1,))/" $file