使用 xargs 管道输入的 printf 格式化输出

使用 xargs 管道输入的 printf 格式化输出

我想在我的代码库中搜索字符串的出现情况,然后获取格式化输出作为文件名、行号和代码幻灯片。我在输出的第一行得到了我想要的结果,但是接下来的行丢失了想要的格式。

$ find src/ -name "*.js" | xargs grep --null -E -n 'filter\(|map\(' | xargs -0 printf "%-100s%-5s%-100s" > test.txt

输出如下:(向右滚动查看完整行)

src/components/AppRouterSwitch.js                                                                   15:    return _Routes.map((route, index) => {
src/components/forms/UserEditForm/UserEditForm.js36:    const options = UserTypes.map((type, index) => <option key={index} value={type.type}>{type.name}</option>);
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js119:        templates:state.templates.filter(item=>item.SOLUTIONID ==id)
src/components/pages/AdminPage/SolutionManagementEditPage/SolutionManagementEditPage.js120:            .map(item=>{return{

第一行看起来正如我想要的。以下内容会丢失所需的格式。以 printf 格式字符串结尾并/n不能解决问题。

答案1

find src/ -type f -name '*.js' -exec grep -Hn -E -- 'filter\(|map\(' {} + |
    awk -F: '{printf "%-100s%-5s%-100s\n", $1, $2, substr($0, length($1) + length($2) + 3)}'

选项-Hgrep导致它打印文件名,即使使用单个文件作为参数调用也是如此。-type f为了跳过损坏的链接和恰好被命名的目录,需要使用 find选项*.js

或者更简单,完全摆脱 grep (感谢@don_crissti 的建议):

find src/ -type f -name '*.js' -exec awk '/filter\(|map\(/{printf "%-100s%-5s%-100s\n", FILENAME, FNR, $0}' {} +

答案2

man让人有点不清楚。 “扫描将在第一次匹配时停止” - 表示将打印所有文件名,但对匹配单词的扫描将在第一次出现时停止。 GNU grep 人页面澄清了这一点:

-l
--files-with-matches
Suppress normal output; instead print the name of each input file from which output would normally have been printed. The scanning of each file stops on the first match. (-l is specified by POSIX.)

这是一个例子:

$grep -iR Intel * 
2018/jan/cpu.txt:Intel i9 
2018/motherboard.txt:Intel Motherboard 
hardware.txt:Intel Corei7
#the same result as you provided;

$grep -iRl Intel * 
2018/jan/cpu.txt
2018/motherboard.txt
hardware.txt
#the desired result

相关内容