sed:之前没有正则表达式

时间:2013-03-25 19:53:21

标签: sed

我正在尝试在脚本中运行以下表达式来查找设备并更改html文件中与设备关联的字段之一。

sed -e "s/$OLDTEST/$TESTING/" -e "s/$CURRENTVALU/$NEWSTATUS---$DATE/" -e "s/$PASSORFAIL/$PASSORFAILNEW/" -e "s/$BGCOLOR/$BGCOLORNEW/$POSITION"  -e "s/$OLDNOTE/$NOTE/"  >> //sysadm/shared/file.tmp

我似乎不断得到“没有以前的正则表达式”。有任何想法吗?

调试日志输出:

sed -e s//Yes/ -e s//Resolved---03-25-13/ -e s//Pass/ -e s//#348017/1 -e s///

sed: -e expression #5, char 0: no previous regular expression

谢谢, 戴夫

1 个答案:

答案 0 :(得分:7)

您的调试日志告诉您整个故事; - )

sed -e s//Yes/ -e s//Resolved---03-25-13/ -e s//Pass/ -e s//#348017/1 -e s///
 #------^-- empty regular expression

因此出现错误消息"no previous regular expression".

不清楚您的体验,因此有2种解决方案。回想一下,在基于unix / linux的shell中,dbl-quotes中的字符串将被评估变量替换,并且你的代码"s/$OLDTEST/$TESTING/"看起来像一个需要变量替换的字符串。

您可能需要

export OLDTEST="something old"
export TESTING="something new"

使代码生效。

如果你真的想要用文字字符串'$ TESTING'代替文字字符串'$ OLDTEST',那么你必须“隐藏”来自shell处理的变量。我们在unix / linux中通过使用单引号字符,那么你的命令就是

sed 's/$OLDTEST/$TESTING/
     s/$CURRENTVALU/$NEWSTATUS---$DATE/
     s/$PASSORFAIL/$PASSORFAILNEW/
     s/$BGCOLOR/$BGCOLORNEW/$POSITION
     s/$OLDNOTE/$NOTE/"  >> //sysadm/shared/file.tmp

但是..我在这里看不到输入文件。

所以真的

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile >> //sysadm/shared/file.tmp

你可能真的不想在现有文件中追加tmp扩展名,所以......

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile > //sysadm/shared/file.tmp
#-----------------------------------------------only one > -^-------

使用>>表示您的测试增强了您的sed脚本,您将每次运行的结果附加到同一个文件中。你最终会收到很多重复信息。

我使用了sed速记,省略了-e选项。如我在此处所示,Sed可以将整组cmd作为一个参数处理。您还可以将所有这些命令放入单独的文件中,然后将其称为

   sed -f fixer.sed inputFile > //sysadmin/shared/file.tmp

最后,如果您的sed支持-i选项,则可以'在线'更改您的更改

sed -i -f fixer.sed inputFile

sed会用更改覆盖旧文件。我建议不要这样做,直到你确定所有改变你的尝试工作并且不会导致任何意想不到的后果。一旦你的原始文件消失了,就没有收回它,所以保存到.tmp就像你正在做的那样是一个很好的安全带: - )

IHTH