Text-Processing

使用 xargs 管道輸入 printf 格式化輸出

  • November 13, 2018

我想在我的程式碼庫中搜尋字元串的出現次數,然後將格式化輸出作為文件名、行號和程式碼幻燈片。我在輸出的第一行得到了我想要的,但是接下來的行失去了想要的格式。

$ 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並不能解決問題。

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選項,它也會列印文件名。為了跳過碰巧被命名的損壞的連結和目錄,需要使用 findgrep選項。-type f``*.js

或者更簡單,完全擺脫 grep (感謝@don_crissti 的建議):

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

引用自:https://unix.stackexchange.com/questions/481413