如何将git diff多行变更文件列表转为||分隔的file:前缀单行格式
需求说明
通过命令git diff --name-only HEAD master获取Pull Request中的变更文件列表,原始输出为每行一个文件路径,示例如下:
my/repo/file1.java my/repo/file3.java my/repo/file5.java
需要将输出转换为file:路径1||file:路径2||file:路径3的格式,用于在IntelliJ IDEA中指定文件运行代码分析。已知所有文件名均不包含空格或换行符。
之前尝试的命令:
git diff --name-only HEAD master | sed -e 's/^/file:/' | paste -s -d "||" -
实际输出分隔符仅为单个|,不符合预期。
问题原因
paste命令的-d参数接收的是分隔符字符集合,会循环逐个取用集合内的单个字符作为行间隔,不会将传入的完整字符串作为固定分隔符,因此传入"||"时始终只会取第一个|做拼接,最终输出只有单竖线。
可用实现方案
以下命令均可输出符合要求的结果:
最简sed实现(无额外依赖)
git diff --name-only HEAD master | sed 's/^/file:/;H;${x;s/\n/||/g;p};d'逻辑:先给每行添加
file:前缀,再将所有行缓存到内存,最后统一把换行符替换为||输出。高可读性awk实现
git diff --name-only HEAD master | awk '{printf "%sfile:%s", sep, $0; sep="||"} END{print ""}'逻辑:第一行直接输出带前缀的路径,后续每行输出前先添加
||分隔符,处理完所有行后补末尾换行,逻辑清晰方便调整格式。兼容原有paste思路的写法
git diff --name-only HEAD master | sed -e 's/^/file:/' -e 's/$/||/' | paste -s -d "" - | sed 's/||$//'逻辑:先给每行加前缀和末尾分隔符,直接无间隔拼接所有行后,删除最后多余的尾部分隔符即可。
针对示例输入,以上命令均会输出目标格式内容:
file:my/repo/file1.java||file:my/repo/file3.java||file:my/repo/file5.java
内容的提问来源于stack exchange,提问作者Saif
相关产品推荐
相关产品推荐

