我正在编写git污迹过滤器。
.gitconfig
[filter "smudgey"]
smudge = smudge_filter
污点过滤器
#!/usr/bin/env bash
# $Id Date: Wed, Mar 25, 2020 1:41:34 PM, User: Joey Gough, Branch: master$
IFS=
log_string="$Lognhello world"
changed_data=$(sed s/$Log[^$]*/"$log_string"/g $1)
echo $changed_data
过滤文件
$Log$
结果
当我签出这个文件时,它会转换Log标签并插入"helloworld">
$Log
hello world$
情况
当我将.gitconfig
重写为:
[filter "smudgey"]
smudge = smudge_filter --smudge %f
它打印出两行换行符,仅此而已。
我已经尝试了很多不同的方法,到目前为止,我似乎无法在Bash脚本中同时访问文件名和文件内容。
问题
如何在git过滤器中同时访问文件内容和文件名?或者我可以吗?
如何访问文件内容。。。
没有文件内容。或者,更好的表达方式是:有内容。它们(尚未(在任何文件中。
和文件名同时。。。
您有一个通过%f
指令获取文件名的方法。
需要记住的重要一点是文件还不存在1内容将在过滤后进入该文件!
如果sed
命令执行您想要的操作,请保持sed
命令的原样。如果您想将文件名放在某个位置,请分别执行。
这里有一个污点过滤器,它用空格替换fill in the blank
,并在顶部插入文件名:
#! /bin/sh
# invoked as "smudge %f" from .gitconfig settings
printf "%sn" "$@"
sed 's/fill in the blank/_________________/'
这里有一个不同的污点过滤器,它用文件名取代__myname__
:
#! /bin/sh
quoted=$(printf "%s" "$@" | sed -e 's,/,\/,g' -e 's,&,\&,g')
sed "s/__myname__/$quoted/"
(引用技巧是确保$quoted
不会扩展到影响sed
替代命令的字符:正斜杠是分隔符,与号将被左手边取代。(
1嗯,文件可能存在,也可能不存在。它可能是空的。在你的情况下,它显然确实存在,并且大部分或完全是空的。这里有各种竞争条件,因为过滤是管道的一部分,不同的过程会做不同的事情。
请注意,如果切换到长寿命过滤器,详细信息会发生变化,但总体策略是相同的:要过滤的文本还不在目标文件中。