2013-02-12 78 views
0

所以,我环顾四周寻找答案,实际上我发现了一些,但似乎没有工作...perl从命令行查找并替换。特殊字符?

我有一个文件夹,里面装满了需要修改的bash脚本。具体而言,我需要

INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/${RUN} 

更换线

INPUT=/data/scratch02/mpgussert/HAWC-30/${RUN}_reco 

我已经试过这

perl -w -i -p -e "s'INPUT=/data/scratch02/mpgussert/HAWC-30/${RUN}_reco'INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/${RUN}'g" *.sh 

其执行没有错误,但没有查找和替换所需的文本。根据我的理解,使用'去除正则表达式应该搜索没有特殊字符替换。那是对的吗?如果是这样,任何想法为什么失败?

我也曾尝试

perl -w -i -p -e "s/INPUT=\/data\/scratch02\/mpgussert\/HAWC-30\/\$\{RUN\}_reco/INPUT=\/data\/hawc01\/hawcroot\/data\/hawc\/reconstructed\/quesadilla\/\$\{RUN\}/g" *.sh 

反斜杠应该忽略特殊字符替换,但返回以下错误。

Backslash found where operator expected at -e line 1, near "RUN\" 
syntax error at -e line 1, near "RUN\" 
Execution of -e aborted due to compilation errors. 

所以它搜索RUN \,这不是我想要的......任何想法?我将不胜感激任何帮助。

谢谢!

+2

你必须建立一个shell命令的问题,所以这将是很好的知道哪些外壳使用的是! – ikegami 2013-02-12 20:21:39

+1

用'''尝试。许多shell会根据此更改插值,错误消息听起来像。另外,考虑更改'/'分隔符以避免“倾斜牙签”。例如,将牙签直放:'s | INPUT =/foo/bar |真棒|':D(尽管这不是唯一可能的分隔符替换,并且如果需要*替换*,它的选择很差)。 – 2013-02-12 20:25:18

+0

我在Bash,谢谢! – Tsadkiel 2013-02-12 20:38:35

回答

1

你想要的图案为...\$\{RUN\}...,但是这不是你传递什么:

$ echo "...\$\{RUN\}..." 
...$\{RUN\}... 

您也需要做更多的逃逸,或者切换到单引号。

$ echo '...\$\{RUN\}...' 
...\$\{RUN\}... 

一起:

perl -i -wpe' 
    s{INPUT=/data/scratch02/mpgussert/HAWC-30/\$\{RUN\}_reco} 
    {INPUT=/data/hawc01/hawcroot/data/hawc/reconstructed/quesadilla/\${RUN}}g 
' *.sh 
+0

辉煌!谢谢ikegami! – Tsadkiel 2013-02-12 21:09:58