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)}'

オプションを使用すると、単一のファイルを引数として呼び出す場合でもファイル名を印刷できます-H。壊れたリンクと名前付きディレクトリをスキップするには、検索オプションを使用します。grep-type f*.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

関連情報