带有转义的Linux SED命令语法

时间:2017-01-05 17:30:40

标签: linux sed

我正在尝试使用子目录中的脚本调用替换脚本调用。

例如,最初我的脚本中有./output.sh来调用当前目录中的output.sh脚本。

我想将./output.sh替换为../output.sh,以便在父目录中调用output.sh

我试过

sed -i -e 's/../\output.sh/./\output.sh/g' scriptName.sh

返回

  

char 17:'s'的未知选项

任何有关sed转义字符语法的帮助都会很棒。

3 个答案:

答案 0 :(得分:1)

Sed对此不好;如果您不小心,则可能会将已存在的~T转为../output.sh

这是最好的sed可以做到的:

.../output.sh

(我使用sed -i 's@output\.sh@../$@g' scriptName.sh 代替@,因此没有正斜杠可以逃脱.Sed接受任何标点字符代替正斜杠。)

请注意,这会将/转换为../output.sh,但至少不会产生三点错误。

相反,请尝试perl:

../../output.sh

这使用负面的后视来确保它不会遍历父母的父母。它还允许使用perl -pie 's@(?<!\.\./)(output\.sh\b)@../$1@g' scriptName.sh 来表示单词中断,以防万一在某处有\b这样的内容。

答案 1 :(得分:0)

如果您将其设置为s,则斜杠字符在sed的s/something/replacement/flags命令中是特殊的,因此文件路径中的斜杠会导致错误。幸运的是,您可以在s之后使用任何其他字符,例如s@something@replacement@flags。因此,用s@\./output.sh@../output.sh@g替换命令应该可以解决问题。

请注意两个额外的更改:您必须在第一个表达式中转义点,因为它也是正则表达式中的特殊字符,并且您还获得了搜索表达式和替换的颠倒顺序(感谢charli注意到这一点)。您也不需要在o个字符之前使用反斜杠。

或者,您可以在/之后使用s,但可以通过在它们前面添加反斜杠来转义要替换的文字斜杠:s/\.\/output.sh/..\/\output.sh/g。在您的代码中,您似乎尝试使用此解决方案,但在反斜杠之后而不是斜杠之前放入反斜杠。

答案 2 :(得分:0)

这样就可以了。将./output.sh ../output.sh的每个外观替换为sed 's/\.\/output\.sh/\.\.\/output\.sh/g' scriptName.sh

\

转义字符为.。你应该用它来逃避:

  • 每个点/。该点用作正则表达式中的任何字符。
  • 每个斜杠s。斜杠字符用作SELECT [Main Query].SaltInfo_ID, Sum([Main Query].Tons) AS [Total Of Tons], Sum([Main Query].BlastTons) AS [Total Of BlastTons], Sum([Main Query].LiqGal) AS [Total Of LiqGal], Sum([Main Query].LiqBlastGal) AS [Total Of LiqBlastGal], ((Nz([Total Of Tons])+Nz([Total of BlastTons]))*66.63)+((Nz([Total Of LiqGal])+Nz([Total of LiqBlastGal]))*0.182) AS [TOTAL COST] FROM [Main Query] WHERE ((([Main Query].EventDate) Is Not Null)) GROUP BY [Main Query].SaltInfo_ID; 命令上的正则表达式之间的分隔符。