使用 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
由于 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