Я хочу найти в моей кодовой базе вхождение строки, а затем получить отформатированный вывод в виде имени файла, номера строки и области кода. Я получил это, как я хотел в первой строке вывода, но следующие строки теряют желаемое форматирование.
$ 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
не добивается цели.
text-processing
awk
grep
text-formatting
Максимум
источник
источник
-l
(строчная L)Ответы:
-H
Вариантgrep
заставит его напечатать имя файла , даже при вызове с одним файлом в качестве аргумента. Параметр-type f
поиска необходим для того, чтобы пропустить неработающие ссылки и каталоги, которые случайно названы*.js
.Или даже проще, избавиться от grep полностью (спасибо @don_crissti за предложение):
источник
man
делает это немного неясным. «Сканирование остановится при первом совпадении» - означает, что будут напечатаны все имена файлов, но сканирование по совпадающему слову будет остановлено при первом совпадении. Страница руководства GNU grep разъясняет это:Вот пример:
источник