2017-11-29 15 views
1

私はファイルのgit diff結果の特定の行を繰り返し処理しようとしているKornシェルスクリプトを作成しています。知らない人のために、git diffリストは変更がファイルに加えて、次のようになり、その出力は、(変更のみのライン3と5と仮定した場合):私は、文字列でこの結果を保存している特定の種類の変更に関するgit diff出力の検索

unchanged line 1 
unchanged line 2 
- previous version of line 3 
+ new version of line 3 
unchanged line 4 
- previous version of line 5 
+ new version of line 5 

を変数(例:diff)、または-(たとえば、- previous version of line 3)で始まるdiffの各行について繰り返し処理する必要があります。最も直感的な解決策は、明らかにdiffの各行を繰り返し、if line contains + or -のようなものを使用しますが、diffは別々の行の配列ではなく、別の場所に\nで区切られた文字列です。

私が探しているのは、文字列の各部分を2つの\n文字の間で抽出する方法です。

これをKornシェルでどのように達成できますか?あるいは、より良い選択肢を提案するかもしれません。アプローチ以下

+0

を見つけたそして、あなたは 'この中でkorn'タグに失敗しました...ところで、疑問を。 kornシェルは配列のようなbashをサポートしていませんか? – sjsam

+0

@sjsam kornは検索時にタグとして表示されません。昨日まで現れていた。そして、kornは配列をサポートします。 2つの '\ n'文字の間で結果の各部分を抽出し、それを配列に移動することをお勧めしますか? – lebowski

+0

私はあなたがそれを抽出する必要はないと思う。配列演算子の中ではいつでもコマンド置換を行うことができます。 kornタグに関しては、ごめんなさい – sjsam

答えて

1

あなたは私がフィルタラインにすぎgrepを追加した+または-のいずれかで始まる行を必要とするので

git diff | grep '^[+-]' | while read -r -d$'\n' line 
do 
if [ ! -z "$line" ] 
# The last line would always be empty, but cond. above is an overkill anyway 
then 
# Do something useful with "$line" 
fi  
done 

に合わせなければなりません。


注:ksh 93u+ 2012-08-01エミュレータを使用[ here ]

+0

'diff =($(git diff))'は、git diff結果の各部分を、空白文字で区切って配列の別の要素にしたようです。したがって、現在は '変更されていない'、 'line'と' 1'はすべて配列の別個の要素です。私は各行を配列の別個の要素として持つことを望んでいます。 – lebowski

+0

@lebowski:確かに私はそれに気付きました、そして、それはあなたが望むものではありません。だから編集を参照してください.. – sjsam

+1

それは働いた。ありがとう! – lebowski

関連する問題