2017-01-05 52 views
-1

我想用子目錄中的腳本調用替換腳本調用。帶有轉義的Linux SED命令語法

例如,最初我在我的腳本中有./output.sh在當前目錄中調用output.sh腳本。

我想將./output.sh替換爲../output.sh,以便它在父目錄中調用output.sh

我試圖

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

此方法返回

焦炭17:未知的選項,以 'S'

與sed的轉義符任何幫助將是巨大的。

+1

要將「./output.sh」替換爲「../output.sh」,您可以嘗試'sed's @ \([^。] \)\ ./ output \ .sh @ \ 1 ../output.sh @ g'(這不會匹配行首的條目,但可爲您提供一個解決方案的良好開端)。但這不是解決您的問題的正確方法! –

+0

或者[sed搜索並替換包含/](http://stackoverflow.com/q/10309968/3266847)或[在sed替換中使用斜槓]的字符串(http://stackoverflow.com/q/5864146/3266847) –

回答

0

如果您將它制定爲s/something/replacement/flags,則斜槓字符在sed的s命令中是特殊的,因此您的文件路徑中的斜槓會導致錯誤。幸運的是,您可以在s之後使用任何其他字符,例如[email protected]@[email protected]。所以,用[email protected]\./[email protected]/[email protected]替換命令應該可以做到。

請注意兩個額外的變化:您必須在第一個表達式中轉義點,因爲它也是正則表達式中的特殊字符,並且您還獲得了搜索表達式和替換的反向順序(感謝charli注意到這一點)。在o字符之前,您不需要反斜槓。

或者,您可以在s之後使用/,但通過在前面加上反斜槓來替換您要替換的斜槓:s/\.\/output.sh/..\/\output.sh/g。在你的代碼中,你似乎試圖使用這個解決方案,但在反斜槓之前而不是斜槓之前放置反斜槓。

+1

如果你不想逃避這些問題,它可以將'strings/output.sh'替換爲'director。/ output.sh'。另外,問題是從'./ output.sh'更改爲'../ output.sh',你的模式被顛倒過來。 – charli

+1

@charli感謝您指出這一點。有很多原始表達式的問題,我只是在沒有注意的情況下對它們進行了剔除。 –

0

這會做伎倆。替代../output.sh./output.sh每一次出場:

sed 's/\.\/output\.sh/\.\.\/output\.sh/g' scriptName.sh 

轉義字符\。您應該使用它來逃脫:

  • Every dot .。該點用作正則表達式中的任何字符。
  • 每斜線/。斜槓字符在s命令中用作正則表達式之間的分隔符。
1

Sed對此很不好;如果你不小心,你會冒險將現有的../output.sh變成.../output.sh

這是最好的sed可以這樣做:。

sed -i '[email protected]\[email protected]/[email protected]' scriptName.sh 

(我使用的是@代替/,以便有沒有斜槓逃離桑達接受任何標點符號到位前進削減。)

請注意,這會將../output.sh轉換爲../../output.sh,但至少不會產生三點錯誤。

相反,嘗試的Perl:

perl -pie '[email protected](?<!\.\./)(output\.sh\b)@../[email protected]' scriptName.sh 

它使用負向後看,以確保它不會穿越到父親的父親。它也允許使用\b來表示一個分詞符號,以防在某些地方有類似output.shelf的地方。