私はディレクトリを再帰的に検索し、特定の文字列を見つけて、その特定のファイルでその文字列を開く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
問題がなくなりました。