sed 在一行中加入一些字符,这一行中的前面部分是随机生成的不能动,只是在最后加入一个值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed 在一行中加入一些字符,这一行中的前面部分是随机生成的不能动,只是在最后加入一个值相关的知识,希望对你有一定的参考价值。

我的文件第一行是

201305211705||ORU^R01|20130521171159|P||||||||
我现在想变成
201305211705||ORU^R01|20130521171159|P|2.3|||||||
我每天收到30个这种文件,文件P前面的值是不一定的。不能改整行
我写了个脚本
cd /home/vftp/error/
for fileName in $(ls *MHL.hl7)

sed -i '1!b;s/|P||||||||/|P|2.3|||||||/' $fileName

mv $fileName /home/vftp/mhl/
done
但是运行的时候提示line 4: syntax error near unexpected token `sed'

大侠救我。

参考技术A 在sed上一行加个do,不是sed问提,是循环语句的问题吧,你试试。 参考技术B find /home/vftp/error/ | gawk 'BEGINFS=OFS="\/" /MHL.hl7$/ print "sed -f a.sed "$0" >/home/vftp/mhl/"$NF | sh

a.sed:
s/|P||||||||/|P|2.3|||||||/g;本回答被提问者采纳

sed在匹配行前面或者后面插入一行

在匹配的行后面插入一行:

sed -i '/匹配行pattern/a\\新插入的行'

新插入的行或者匹配行如果有特殊字符,记得转义。

也可以是:

sed -i '/匹配行pattern/a 新插入的行'

如果要在匹配的行前面插入一行,把a命令改成i命令即可。

演示:

1.查看原文件中的内容

[root@testvm02 ~]# cat nrpe.cfg 
#command[check_users]=/usr/local/nagios/libexec/check_users -w $ARG1$ -c $ARG2$
#command[check_load]=/usr/local/nagios/libexec/check_load -w $ARG1$ -c $ARG2$
#command[check_disk]=/usr/local/nagios/libexec/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
#command[check_procs]=/usr/local/nagios/libexec/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$

2.通过sed实现在搜索到某个字符串之后,在下一行插入字符串

[root@testvm02 ~]# sed -i '/#command\\[check_procs\\]/a\\command\\[check_disk\\]=\\/usr\\/local\\/nagios\\/libexec\\/check_disk -w 15\\% -c 10\\% -p \\/ -C -w 15\\% -c 10\\% -p \\/mnt' nrpe.cfg 
[root@testvm02 ~]# cat nrpe.cfg 
#command[check_users]=/usr/local/nagios/libexec/check_users -w $ARG1$ -c $ARG2$
#command[check_load]=/usr/local/nagios/libexec/check_load -w $ARG1$ -c $ARG2$
#command[check_disk]=/usr/local/nagios/libexec/check_disk -w $ARG1$ -c $ARG2$ -p $ARG3$
#command[check_procs]=/usr/local/nagios/libexec/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$
command[check_disk]=/usr/local/nagios/libexec/check_disk -w 15% -c 10% -p / -C -w 15% -c 10% -p /mnt

另,a后面的\\可以不需要:

sed -i '/#command\\[check_procs\\]/a command\\[check_disk\\]=\\/usr\\/local\\/nagios\\/libexec\\/check_disk -w 15\\% -c 10\\% -p \\/ -C -w 15\\% -c 10\\% -p \\/mnt' nrpe.cfg 

注意:这里没有s/原/新/的方法,也就是没有s这个参数,并且最后没有/.

以上是关于sed 在一行中加入一些字符,这一行中的前面部分是随机生成的不能动,只是在最后加入一个值的主要内容,如果未能解决你的问题,请参考以下文章

sed在匹配行前面或者后面插入一行

sed命令,搜索某个字符串,结果有多个匹配行,在第一个匹配行的前面添加一行内容

如何用sed命令替换一行中的某个字符串

Sed在匹配行前后加入一行

使用 sed 在一行中重复字符串

使用 sed 跳过一行的一部分