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問題がなくなりました。

関連情報