Bash 스크립트의 배열 요소는 일종의 인코딩 오류로 인해 nano의 파일 이름으로 사용할 수 없습니다.

Bash 스크립트의 배열 요소는 일종의 인코딩 오류로 인해 nano의 파일 이름으로 사용할 수 없습니다.

저는 디렉터리를 재귀적으로 검색하고 특정 문자열을 찾은 다음 해당 특정 파일에서 해당 문자열을 여는 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

모든 것이 잘 작동하지만 nanobash 스크립트에서 배열 출력 호출을 사용할 때 인코딩 오류가 설명되는 것 같습니다.

bashscript의 문자열은 괜찮지만 nano ./app.vue./^[[35m^[[Kapp.vue^[[m^[[K^[[36m^[[K. 파일 이름 주위에 제거할 수 없는 명령 문자가 많이 있습니다.

nano app.vue유효한 스크립트의 시작 부분에 배치하면 nanojust 또는 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문제가 사라졌습니다.

관련 정보