sed:之前没有正则表达式

cyc*_*oxr 5 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
Run Code Online (Sandbox Code Playgroud)

我似乎继续得到一个"没有以前的正则表达式".有任何想法吗?

调试日志输出:

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
Run Code Online (Sandbox Code Playgroud)

谢谢,戴夫

she*_*ter 7

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

sed -e s//Yes/ -e s//Resolved---03-25-13/ -e s//Pass/ -e s//#348017/1 -e s///
 #------^-- empty regular expression
Run Code Online (Sandbox Code Playgroud)

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

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

你可能需要这样做

export OLDTEST="something old"
export TESTING="something new"
Run Code Online (Sandbox Code Playgroud)

使代码工作.

如果你真的想要用文字字符串'$ 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
Run Code Online (Sandbox Code Playgroud)

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

所以真的

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile >> //sysadm/shared/file.tmp
Run Code Online (Sandbox Code Playgroud)

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

sed 's/ ...../..../ ; s/../..../; etc; s/.../../' inputFile > //sysadm/shared/file.tmp
#-----------------------------------------------only one > -^-------
Run Code Online (Sandbox Code Playgroud)

使用>>means作为增强sed脚本的测试,将每次运行的结果附加到同一文件中.你最终会得到很多重复的信息.

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

   sed -f fixer.sed inputFile > //sysadmin/shared/file.tmp
Run Code Online (Sandbox Code Playgroud)

最后,如果您sed支持该-i选项,您可以"内联"您的更改,只需拥有

sed -i -f fixer.sed inputFile
Run Code Online (Sandbox Code Playgroud)

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

IHTH