我正在尝试使用子目录中的脚本调用替换脚本调用。
例如,最初我的脚本中有./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转义字符语法的帮助都会很棒。
答案 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;
命令上的正则表达式之间的分隔符。