Я столкнулся с проблемой, пытаясь написать сценарий Bash. Когда grep
выводит, он возвращает (обычно) много строк. Я хотел бы префикс и суффикс строки для каждой из этих строк вывода.
Я также хотел бы отметить , что я ТРУБОПРОВОДНЫЙ ls
в grep
, как:
ls | grep
bash
shell-script
grep
SpecialBomb
источник
источник
ls
- это плохо, джиу. Кроме того, это должно бытьgrep
? И можете ли вы привести пример вывода?Ответы:
С помощью sed:
источник
sed
будучи надмножествомgrep
:ls | sed -n '/txt/s/.*/prefix&suffix/p'
илиls | sed -n 's/.*txt.*/prefix&suffix/p'
С
sed
:Но обратите внимание, что это страдает от проблем с именами файлов с переводами строк и от всех разных проблем синтаксического анализа,
ls
что, как правило, плохая идея.С perl
Примечание. Perl
grep
может использовать шаблон - какgrep
команда, но вы также можете выполнять такие действия, как применение файловых тестов.Например
В
grep
итераторе по умолчанию$_
установлено текущее значение элемента, поэтому вы можете применять регулярные выраженияsed
/grep
стиль или выполнять различные задачи на основе$_
.источник
“
и просто используйте их.В этом случае GNU
find
позволяет вам делать все эти вещи за один раз, устраняя каналы и потенциально проблемный анализls
:(
find
конечно, это не хороший способ произвольно изменить вывод других команд!)Некоторые заметки:
-maxdepth 1
и-name [^.]*
заставить сопоставление имен работать так же, как обычныйls
(илиls .
). Вы можете использовать любой глобус в стиле оболочки, но учтите, что «*» будет соответствовать лидирующему «.» в имени † в отличие отbash
, значит[^.]*
означает что-либо, что не имеет лидирующего ".".*thing.*
а не простоthing
-name
/-regex
вместо обоих (например, -regex "[^.]. MYPATTERN. "-printf
поддерживает много вещей ,%n
является неукрашенным имя файла или каталогаВ качестве возможной альтернативы без каких - либо внешних программ , необходимых,
bash
есть ,compgen
которые, помимо всего прочего, расширяет шарики, что эквивалентноls
без опций:Это обрабатывает имена файлов с пробелами, включая переводы строк.
compgen -G "*"
должен обеспечивать тот же вывод, что и обычныйls
(но обратите внимание, чтоls *
это совсем другое). Вам все еще нужноgrep
, и это может или не может решить проблему, но стоит упомянуть.источник
sed
иfind
решения оспариваются, если ваш префикс / суффикс включает ключевые символы регулярного выражения или если вы хотите передать переменную окружения (вместо непосредственного значения),xargs
+echo
может быть более подходящим здесь.С переменной среды:
Со встроенным:
источник