這是我的問題,我寫了下面這行代碼來正確地格式化在目錄中遞歸找到的文件列表。SED壞代替錯誤
find * | sed -e '/\(.*\..*\)/ !d' | sed -e "s/^.*/\${File} \${INST\_FILES} &/" | sed -e "s/\(\)\([a-zA-Z0-9]*\/\)/\/\2/" | sed -e "s/\(\/\)\([a-zA-Z0-9\_\-\(\)\{\}\$]*\.[a-zA-Z0-9]*\)/ \2/"
第二步是將此命令的輸出寫入腳本。雖然上面的代碼具有預期的行爲,但是當我嘗試將其輸出存儲到變量時發生問題,我從行中的第一個sed命令得到了錯誤的替換錯誤。
#!/bin/bash
nsisscript=myscript.sh
FILES=*
for f in $(find $FILES); do
v=`echo $f | sed -e '/\(.*\..*\)/ !d' | sed -e "s/^.*/\${File} \${INST\_FILES} &/" | sed -e "s/\(\)\([a-zA-Z0-9]*\/\)/\/\2/" | sed -e "s/\(\/\)\([a-zA-Z0-9\_\-\(\)\{\}\$]*\.[a-zA-Z0-9]*\)/ \2/"`
sed -i.backup -e "s/\;Insert files here/$v\\n&/" $nsisscript
done
請你幫我理解兩種情況之間有什麼不同,以及爲什麼我得到這個錯誤?
在此先感謝!
嗯......我想我自己找到了解決方案。在分隔符裏面,「$」被解釋爲某種原因,無論是單獨還是在它之前有一個反斜槓。解決方法是在每個「$」字符前加2個反斜槓。 v ='echo $ f | sed -e'/\(.*\..*\)/!d'| sed -e「s /^.*/\\$ {File} \\ $ {INST \ _FILES}&/」..... 我很樂意聽到爲什麼會出現這種情況, 。 – Patrick
與您的問題本身無關,但似乎您不知道可以更改sed的分隔符,因此您不必跳過斜線。只要選擇另一個你不需要的字符,比如':':'sed's:pattern:substitution:',這將大大提高正則表達式在處理路徑時的可讀性 – carlpett