使用 sed 修复 mocha lcov 输出的更好方法

Better way to fix mocha lcov output using sed

由于 mocha-lcov-mocha 破坏文件路径的已知概率,我需要修复当前的输出路径,如下所示:

SF:Vis/test-Guid.coffee
SF:Vis/Guid.coffee
SF:Vis/test-Vis-Edge.coffee
SF:Vis/Vis-Edge.coffee

进入

SF:test/Vis/test-Guid.coffee
SF:src/Vis/Guid.coffee
SF:test/Vis/test-Vis-Edge.coffee
SF:src/Vis/Vis-Edge.coffee

我不太擅长 sed,但我可以使用它:

mocha -R mocha-lcov-reporter _coverage/test --recursive | sed 's,SF:,SF:src/,' | sed s',SF.*test.*,SF:test//&,' | sed s',/SF:,,' | sed s',test/src,test,' | ./node_modules/coveralls/bin/coveralls.js

这基本上是按顺序执行 4 个 sed 命令

sed 's,SF:,SF:src/,' 
sed s',SF.*test.*,SF:test//&,'
sed s',/SF:,,' 
sed s',test/src,test,' 

我的问题是是否有办法使用这个 sed 命令,或者使用另一个 osx/linux 命令行工具

可以 将所有 sed 命令放在一个文件中,每个命令一行,然后只使用 "sed -e script"。但是,如果您只想在单个命令行上使用它,请用分号分隔。这对我有用:

sed 's,SF:,SF:src/,;s,SF.*test.*,SF:test//&,;s,SF:,,;s,test/src/,test,'

最初将 "src/" 放在每个“:”之后,然后如果在行上找到 "test",则将 "src" 替换为 "test":

$ sed 's,:,:src/,;/test/s,src,test,' file
SF:test/Vis/test-Guid.coffee
SF:src/Vis/Guid.coffee
SF:test/Vis/test-Vis-Edge.coffee
SF:src/Vis/Vis-Edge.coffee

sed 命令

 sed '\#test#!{s#SF:Vis/#SF:src/Vis/#g};\#SF:Vis/test#{s#SF:Vis/test#SF:test/Vis/test#g};' my_file

这是一个 awk 版本:

awk -F: '/SF/ {[=10=]=FS (/test/?"test/":"src/")}1' file
SF:test/Vis/test-Guid.coffee
SF:src/Vis/Guid.coffee
SF:test/Vis/test-Vis-Edge.coffee
SF:src/Vis/Vis-Edge.coffee

工作原理:

awk -F: '                               # Set field separator to ":"
/SF/{                                   # Does line start with "SF"?
    [=11=]=FS (/test/?"test/":"src/")   # Recreat String by adding "test" if line contains "test", else "src"
    }
1                                       # Print all lines
' file                                  # read the file