【问题标题】:Searching git diff output for specific kinds of changes在 git diff 输出中搜索特定类型的更改
【发布时间】:2017-11-29 19:47:20
【问题描述】:

我正在编写一个 Korn Shell 脚本,我试图在其中迭代文件的 git diff 结果中的特定行。对于那些不知道的人,git diff 列出了对文件所做的更改,它的输出看起来像这样(假设只有第 3 行和第 5 行发生了变化):

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),我需要遍历diff 中以+- 开头的每一行(例如,- previous version of line 3 )。最直观的解决方案显然是遍历diff 中的每一行并使用if line contains + or - 之类的东西,但我不能这样做,因为diff 不是单独行的数组,而是由\n 分隔的字符串在一些地方。

所以我最终寻找的是一种在两个 \n 字符之间提取字符串每个部分的方法。

如何在 Korn shell 中实现这一点?或者也许你们可以提出更好的替代方案。

【问题讨论】:

  • 你没有在这个标签korn..顺便说一句,一个疑问。 korn shell 不支持 bash 之类的数组吗?
  • @sjsam korn 在我搜索时没有显示为标签。直到昨天才出现。 korn 确实支持数组。您是否建议我在两个 \n 字符之间提取结果的每个部分并将其移动到数组中?
  • 我认为您不需要提取它。您始终可以在数组运算符中进行命令替换。关于 korn 标签,对不起
  • 已添加 Korn shell 标签,请适当添加标签
  • @yacc korn 今天在我搜索时没有显示为标签。事实上,我也没有显示 ksh。

标签: git shell ksh


【解决方案1】:

下面的方法应该适合

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

由于您需要以+- 开头的行,因此我也添加了grep 来过滤行。


注意:使用ksh 93u+ 2012-08-01模拟器发现[ here ]

【讨论】:

  • diff=( $(git diff) ) 似乎已将 git diff 结果的每个部分由任何空格字符分隔为数组的单独元素。所以目前unchangedline1 都是数组的独立元素。我希望将每一行作为数组的一个单独元素。
  • @lebowski :确实我注意到了,这不是你想要的。所以看看编辑..
  • @lebowski 不客气。我也添加了grep 来过滤结果。请参阅最终编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
相关资源
最近更新 更多