我正在尝试在脚本中运行以下表达式以查找设备并在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
谢谢,
戴夫
最佳答案
您的调试日志告诉您整个故事;-)
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".
不清楚您的经历,因此有两种解决方案。回想一下,在基于unix / linux的shell中,将评估dbl引号内的字符串以进行变量替换,并且您的代码
"s/$OLDTEST/$TESTING/"
看起来像需要变量替换的字符串。您可能需要做
export OLDTEST="something old"
export TESTING="something new"
该代码才能正常工作。
如果您确实希望将文字字符串'$ OLDTEST'替换为文字字符串'$ TESTING',则必须“隐藏” shell处理中的变量,我们在unix / linux中通过使用单引号chars来实现。 。,那么您的命令将是
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是一个很好的安全带:-)
高温超导
关于sed - sed:没有以前的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15623520/