2017-04-11 85 views
1

我有一個audacity.cfg文件,其中我想腳本替換兩個插件路徑。路徑以前不同,所以我需要插入更新的路徑。我會在下面提供一個。替換特定字符串後的文件路徑文本

首先,我要找到這個文本,它開始的行中的問題:

FFmpegLibPath

接下來,我想,以取代整行:

FFmpegLibPath = /庫/應用程序Support/audacity/libs/libavformat.55.dylib

就是這樣。它不應該那麼難,但它是。我已經使用sed和awk做了很多實驗,但還沒有能夠獲得任何工作。雖然在線和本論壇中有大量的例子,但他們都沒有工作。他們都會產生與逃逸角色有關的錯誤,以及一些隨機的其他事情。我花了數小時試驗和研究,但還沒有取得任何進展。

我意識到斜槓和空格可能會導致問題,我花了相當多的時間試圖解決這個問題。我嘗試了各種各樣的東西,但正如我所說的,沒有任何工作。

有沒有人有任何想法呢?

在此先感謝您的幫助。

編輯: 我運行的是MacOS 10.10.5,我在研究中看到的其中一件事是使用GNU sed,因爲有些參數沒有它就無法工作。雖然我確信這會產生更好的結果,但我無法使用它,因爲我的用戶不會擁有它。我認爲這是爲什麼這麼困難的部分原因,因爲我看到的許多解決方案都是利用我不能使用的論據。

+2

添加您的實驗中至少一個例子......否則,這只是_give我是一個solution_ type問題...;( – jm666

+1

公平 - 這是我試過的最後一個:sed -e's/:: FFmpegLibPath = [0-9] + $/:: FFmpegLibPath ='#FFmpegLibPath =/Library/Application Support/audacity/libs/libavformat.55.dylib#g'audacity.cfg – SadMarvin

回答

0

如果一切都失敗了,你總是可以使用舊學校ed解決方案。 :) :)

#!/bin/bash 
{ 
printf 'H\n' 
printf '/^FFmpegLibPath[ \t=]/\n' 
printf '%s\n' c 'FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib' . w q 
} | ed -s "/path/to/audacity.cfg" >/dev/null 

引號,空格是強制性的。

以上搜索以FFmpegLibPath開頭的行,然後是spacetab=。所以它會嘗試避免使用類似前綴的衝突:FFmpegLibPath2

如果這樣的衝突是不可能的,上面可以簡單地寫爲:

ed -s "/path/to/audacity.cfg" >/dev/null <<'EOF' 
H 
/^FFmpegLibPath/ 
c 
FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib 
. 
w 
q 
EOF 

printf '%s\n' H '/^FFmpegLibPath/' c 'FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib' . w q | 
ed -s "/path/to/audacity.cfg" >/dev/null 
+0

第一個人工作!驚人!但是,當我嘗試第三個時,它不會識別目標文件路徑。它吐出「沒有這樣的文件或目錄。」 – SadMarvin

+0

在配置文件中只有一個我想要替換的項目實例,但是在替換用戶配置文件中的東西時,我喜歡在謹慎的一面犯錯。 – SadMarvin

+0

然後使用第一個。該模式是'FFmpegLibPath'後面跟着一個'space','tab'或'='。 – jm666

0

可以逃避特殊字符(正斜槓),並將其分配給一個變量:

REPL=$(sed 's/[\/]/\\&/g' <<< "/Library/Application Support/audacity/libs/libavformat.55.dylib") 

&是sed的元字符來表示這是匹配的模式。

sed -E "s/(FFmpegLibPath=).+/\1$REPL/" audacity.cfg 

選項-E用於支持擴展正則表達式

輸出:

etc 
FFmpegLibPath=/Library/Application Support/audacity/libs/libavformat.55.dylib 
etc 
etc 

如果你最好保持在一個單獨的文本文件的更新:

cfg_update.txt 
key_name1=value 
key_name2=value 
key_name3=value 

# define delimiter 
IFS=\= 

cat cfg_update.txt | while read KEY VALUE; do 
    sed -i -E "s/($KEY=).+/\1$VALUE/" audacity.cfg 
done 

選項-i用於編輯文件

最後,請務必在測試前進行備份,祝你好運!

+0

然後我需要製作th是爲了適應多行而放大表達式或腳本的一部分? – SadMarvin

+0

如果有多個更新,您可能需要將它們保留在文本文件中。示例如答案中所示(不能在註釋中構建腳本) – Unwastable

+0

在此特定實例中,只有兩個更改,但對於需要更大更改的事物,將來可能會有用。我使用了一個Firefox配置文件更新項目的類似貓腳本,但我需要它做的只是將新的行放在最後,Firefox會在第一次打開文件時修剪和重新排序文件。 – SadMarvin