Bash
Bash 腳本的數組元素不能作為 nano 的文件名,某種編碼錯誤
我正在尋找一個 bash 腳本,它遞歸地搜尋目錄,找到一個特定的字元串,然後在該特定文件中打開該字元串。
我呼叫這個函式
exert
是因為它消除了在我的軟體中查找特定變數的工作量。例如,如果我的網站在 div 中使用“我喜歡大貓”這樣的片語,而我只想編輯那個 div,我可以輸入“exert ‘我喜歡大貓’”,它將打開包含該 div 的文件與 div 所在的確切位置。到目前為止,這是我的程式碼:
#!/bin/bash echo "Searching for $1" echo "----Inside files----" grep --color=always -nr "$1" * > /tmp/tmpsearch; #searches for ' I like big cats' filesNew=`cat /tmp/tmpsearch` #stores it in a variable that can be split - future version will keep this in memory readarray -t files <<<"$filesNew" #it is split to an array called $files x=0; IFS=":"; #":" is the string delimter for grep's output of files with the string, alongside the line number the string is found inside the file for i in "${files[@]}"; do #The colon operator separates grep's output of line numbers and files that contain the string 'I like big cats' read -ra FOUND <<< "$i" x=$[$x+1]; printf "Found index: $x\n" line=`echo "${FOUND[1]}"` file=`echo "${FOUND[0]}"` nano +$line ./$file #This should open nano at the exact line number done exit 1
一切正常,但
nano
在使用 bash 腳本的數組輸出呼叫時似乎解釋了編碼錯誤。儘管 bashscript 中的字元串很好,但 nano 將讀取文件名,如
./app.vue
as./^[[35m^[[Kapp.vue^[[m^[[K^[[36m^[[K
。文件名周圍有很多我似乎無法擺脫的命令字元。通過放置
nano app.vue
在有效的腳本開頭,我知道這不是 justnano
或 justbash
的問題,而是他們使用數組輸出的問題(從 grep 拆分的字元串)
問題來自於
grep --color=always
作為第一個命令使用。顯然,bash 使用我上面列出的控製字元來跟踪其外殼的顏色。
所以,
./^[[35m^[[Kapp.vue^[[m^[[K^[[36m^[[K
實際上是在告訴 bash,“這個字元串有文本 app.vue,帶有紫色文本著色”。然而,納米是色盲的。如果需要,您可以嘗試使用普通的正則表達式過程從字元串中轉義這些顏色指示符。
就我而言,我很幸運只告訴 grep
--color=never
而不是--color=always
. 問題就這樣消失了。
這些是著色字元串:^[ 是 ESC,[..m 是終端的前景色等。
設置 grep –color=never