我正在编写一个 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
或 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
.问题就这样消失了。