저는 디렉터리를 재귀적으로 검색하고 특정 문자열을 찾은 다음 해당 특정 파일에서 해당 문자열을 여는 bash 스크립트를 작성하고 있습니다.
내가 이 함수를 부르는 exert
이유는 내 소프트웨어에서 특정 변수를 찾는 수고를 덜어주기 때문입니다. 예를 들어, 내 웹 사이트에서 div에 "I like big cats"와 같은 문구를 사용하고 해당 div를 편집하고 싶은 경우 "exert 'I like big cats'"를 입력하면 해당 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
는 ./^[[35m^[[Kapp.vue^[[m^[[K^[[36m^[[K
. 파일 이름 주위에 제거할 수 없는 명령 문자가 많이 있습니다.
nano app.vue
유효한 스크립트의 시작 부분에 배치하면 nano
just 또는 just 의 문제가 아니라 bash
배열 출력(grep에서 문자열이 분할됨) 사용에 문제가 있다는 것을 알 수 있습니다.
답변1
색상 지정 문자열은 다음과 같습니다. ^[는 ESC, [..m은 터미널의 전경색 등입니다.
grep --color=never 설정
답변2
문제는 grep --color=always
첫 번째 명령을 사용할 때 발생합니다.
분명히 bash는 쉘의 색상을 추적하기 위해 위에 나열된 제어 문자를 사용합니다.
따라서 ./^[[35m^[[Kapp.vue^[[m^[[K^[[36m^[[K
기본적으로 bash에게 "이 문자열에는 app.vue 텍스트가 있고 텍스트 색상은 보라색입니다"라고 말하는 것입니다. 하지만 나노는 색맹이다.
필요한 경우 일반 정규식 절차를 사용하여 문자열에서 이러한 색상 표시기를 이스케이프 처리할 수 있습니다.
제 경우에는 운이 좋게도 grep --color=never
대신 에 --color=always
문제가 사라졌습니다.