11

我正在尝试在脚本中运行以下表达式以查找设备并更改 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
4

1 回答 1

14

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

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"

使该代码正常工作。

如果您真的希望将文字字符串 '$OLDTEST' 替换为文字字符串 '$TESTING',那么您必须从 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

于 2013-03-25T21:11:08.103 回答