Bash脚本的数组元素无法充当nano的文件名,某种编码错误

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.vueas 的文件名./^[[35m^[[Kapp.vue^[[m^[[K^[[36m^[[K。文件名周围有很多我似乎无法删除的命令字符。

通过放置nano app.vue在有效的脚本开头,我知道这不是 justnano或 just的问题bash,而是它们使用数组输出(从 grep 分割的字符串)的问题

答案1

这些是着色字符串:^[ 是 ESC,[..m 是终端的前景色等。

设置 grep --color=never

答案2

问题是由于使用grep --color=always第一个命令而产生的。

显然,bash 使用我上面列出的控制字符来跟踪其 shell 的颜色。

所以,./^[[35m^[[Kapp.vue^[[m^[[K^[[36m^[[K实际上是在告诉 bash,“这个字符串有文本 app.vue,文本颜色为紫色”。然而,纳米是色盲。

如果需要,您可以尝试使用正常的正则表达式过程从字符串中转义这些颜色指示符。

就我而言,我很幸运只告诉 grep--color=never而不是--color=always.问题就这样消失了。

相关内容