是否有任何工具/ UNIX单线程可以就地删除多个文件的尾部空格.
例如,可以与find结合使用.
这个问题是继续关于有选择地将行从一个文件附加到另一个文件的另一个问题.
我正在使用的正则表达式在匹配行保持/丢弃时效果很好.问题是该文件是由一堆其他文件组成的,有时我想要保留的行作为UTF-8编码文件的第一行开始.这意味着该findstr命令返回如下内容:
???LineToKeep that started out as the first line in its file
LineToKeep another
LineToKeep more lines
???LineToKeep that started out as the first line in its file
LineToKeep more
Run Code Online (Sandbox Code Playgroud)
保证除了BOM字节外,该行始终以"LineToKeep"开头.如何摆脱这三个UTF-8 BOM字节,因为这些windows shell命令无法正确处理它们?
我希望有一种方法可以将它们移除到位,或者可能是对findstr上一个问题的命令的修改.
因为我知道每一行必须以"LineToKeep"或"∩╗┐LineToKeep"开头,所以我认为有一种方法可以计算出if (Line[3:10] == "LineToKeep") { Line = Line[3:]; }每行的内容.
我正在使用一个IDE,它在一些生成但强烈需要的库文件中生成一个版本.因此,如果我想使用具有多个版本的库,或者我看到一些实际上毫无意义的更改,则会出现问题.
总结:我想忽略一个单一的,我认为Git的过滤器是正确的方法一个或多个文件线.我能够在grep没有问题的情况下找到相关的线路,因为人们可能会看到进一步的阅读.
长话短说,我设置了一个git过滤器来恢复对头文件中版本的任何修改.(请注意,此文件中可能有不同的修改.)
[filter "ignore-version"]
smudge = cat %f || cat
clean = git ls-files %f --error-unmatch >&- 2>&- \
&& sed \"/version/c $(git show HEAD:%f | grep version)\" || cat
Run Code Online (Sandbox Code Playgroud)
(为了更好的阅读,我添加了转义换行符并更改了单词以便简单匹配.在原始版本中没有可能的冲突.)
git ls-files检查文件是否已存在于存储库中(当前为HEAD)1.1如果存在,sed将进行脏工作以用已经跟踪的线替换整条线
1.2如果没有,cat除了继续之前什么都不做(这应该确保一个尚未跟踪的文件不会丢失)
到目前为止,它的确有效.(我可以忍受这样一个事实,即过滤器将所有CRLF静默转换为LF ......)
问题:固定文件被git标记为已修改,尽管存储库的最新文件和过滤版本是二进制相等的.我使用kdiff作为单独的工具检查了这个.
编辑1:这是一些输出,显示两个文件版本的相等性:
$ git show HEAD:file.txt | md5sum
9f95c28cebe4f45b8efb7b0ae64dfa56
$ cat file.txt | md5sum
894e7d1b28180b7a193bf3cdd6ceaacb
$ cat file.txt | git ls-files file.txt --error-unmatch …Run Code Online (Sandbox Code Playgroud) sed ×2
windows ×2
batch-file ×1
cmd ×1
command-line ×1
find ×1
git ×1
git-filter ×1
in-place ×1
shell ×1
whitespace ×1