2013-05-02 168 views
0

我在下面命令SED命令不工作

INPUT_FILE_NAME_PATH="/app/csa/sumit/xyz.out" 

sed -i "s/^$InputFile=.*/$InputFile='${INPUT_FILE_NAME_PATH}'/g" dashboard.prf 

ERROR : sed: -e expression #1, char 36: unknown option to `s' 

面临着一些问题,当我使用INPUT_FILE_NAME_PATH的价值,而不使用“/”,那么,它正在fine..but当我使用“/”在变量INPUT_FILE_NAME_PATH的值中,则发生错误。我知道“/”字符的问题。但是,任何人都可以帮助我解决这个问题。

任何帮助表示赞赏。

+1

里面使用'sed'变量,你需要把它包'''而不是'''。 – fedorqui 2013-05-02 12:56:49

+0

您可以使用'@'而不是'/'作为sed中's'运算符的分隔符。请记住,'$'是行尾特殊字符,所以它可能不会做你认为它的事 – Petesh 2013-05-02 12:58:52

+0

谢谢fedorqui ...我已经更新了代码..但它仍然不工作 – 2013-05-02 13:00:27

回答

1

可以使用@字符而不是/为分隔符,让你的代码看起来像:

INPUT_FILE_NAME_PATH="/app/csa/sumit/xyz.out" 

sed -i '[email protected]^$InputFile=.*@$InputFile='${INPUT_FILE_NAME_PATH}'@g' dashboard.prf 

您可以使用sed -n和添加尾部p测试正则表达式,而无需修改有问题的文件并且仅在其匹配时显示,例如:

sed -n '[email protected]^$InputFile=.*@$InputFile='${INPUT_FILE_NAME_PATH}'@gp' dashboard.prf 

并且只有在匹配时才会打印。这是不是一个好主意,-n-i相结合,为您结束了一个非常小的文件:(

+0

感谢Petesh ..它正在工作.. – 2013-05-02 13:06:41

+0

'$'只有当它在正则表达式结尾时才意味着“行尾”。你给的'sed'可以找到(在GNU sed版本4.2.1上) – cdarke 2013-05-02 13:10:26

+0

@cdarke谢谢你,我已经注意到并且已经删除了这个段落 – Petesh 2013-05-02 13:11:58

0

只需用awk,sed的的-i的好处远远由SED问题与使用shell变量,如抵销您当前所看到的:“”

INPUT_FILE_NAME_PATH="/app/csa/sumit/xyz.out" 

awk -v file="$InputFile" -v path="$INPUT_FILE_NAME_PATH" ' 
    { gsub("^"file"=.*", file"="path); print } 
' dashboard.prf > tmp && mv tmp dashboard.prf 

需要注意的是,像任何SED解决方案,上面用正则表达式上下文中的$ INPUTFILE变量,所以如果thatvariable包含像RE元字符,那么你可以得到不需要的匹配,例如“foo.bar”会匹配“fooXbar”以及“foo.bar”。在sed中没有可靠的解决方案(不要听任何人告诉你逃脱RE元字符,因为它不能可靠地完成),但在AWK你可以使用索引()来匹配字符串而不是一个正则表达式,如:

awk -v file="$InputFile" -v path="$INPUT_FILE_NAME_PATH" ' 
    index($0,file"=")==1{ $0 = file"="path) } { print } 
' dashboard.prf > tmp && mv tmp dashboard.prf 

我会用“指数( )“的方法,如果在你的输入文件内容发生变化时,你将来会避免任何意外。

如果你的awk不支持-v分配变量,则:

awk ' 
    index($0,file"=")==1{ $0 = file"="path) } { print } 
' file="$InputFile" path="$INPUT_FILE_NAME_PATH" dashboard.prf > tmp && mv tmp dashboard.prf 

,或者如果你满意的一个sed的解决方案,那么你一定要幸福与基于RE-解决方案,以便:

awk ' 
    { gsub("^"file"=.*", file"="path); print } 
' file="$InputFile" path="$INPUT_FILE_NAME_PATH" dashboard.prf > tmp && mv tmp dashboard.prf 

终于在这里是为高尔夫球爱好者RE基解决方案:

awk '{gsub("^"f"=.*",f"="p)}1' f="$InputFile" p="$INPUT_FILE_NAME_PATH" dashboard.prf > tmp && mv tmp dashboard.prf 
+0

这绝对是一个更好的解决方案。如果不是因为我最终不得不在debian系统上明确安装'gawk',以使它与依赖'awk'的''gawk'而不是'mawk'的各种软件包一起工作。 – Petesh 2013-05-02 15:23:32

+0

上面没有特定的gawk。如果我是你,我会得到awk以外的awk,因为mawk是最小功能的(几乎总是不必要的)提高的执行速度,但即使在mawk中,上面的MIGHT不工作的唯一的东西是使用-v来分配变量和这是微不足道的,通过在命令之后分配它们。我会更新我的答案以表明这一点。 – 2013-05-02 15:47:05