Я пишу сценарий, я хочу проверить, соответствует ли первая строка файла определенному шаблону, и если это так, распечатать файл. Как мне этого добиться?
Как проверить шаблон? Есть ли способ проверить шаблон и на основе вывода сделать что-нибудь ..
РЕДАКТИРОВАТЬ: Пожалуйста, посмотрите на этот вопрос: /programming/5536018/how-to-get-match-regex-pattern-using-awk-from-file
Я хочу что-то подобное, но никто из них не работал для меня. Я в основном хочу проверить, соответствует ли первая строка шаблону регулярных выражений или нет, и на основе этого вывести строки файла.
Ответы:
Вы можете сделать это с
ed
:Хитрость заключается в том, чтобы попытаться заменить
PATTERN
на1st
себя.ed
выдает ошибку, если не может найти указанный шаблон, поэтому,p
(распечатать весь файл) будет выполнен только в случае1s/PATTERN/&/
успеха.Или с
sed
:он
q
используется, если первая строка не!
совпадает ( )PATTERN
, иначе онp
печатает все строки.Или, как указал Тоби Спейт , с GNU
sed
:Q
то же самое,q
но не печатает пространство шаблона.источник
Q
вместоq
GNU sed илиd
beforeq
(переносимый), чтобы не требовать-n
флаг иp
команду:sed '1{/PATTERN/!Q}' infile
илиsed -e '1{' -e '/PATTERN/!{' -e 'd' -e 'q' -e '}' -e '}' infile
, соответственно.d
перезапускает командный цикл, который всегда ловит меня! : - |sed
перваяsed
команда жалуетсяsed: -e expression #1, char 10: extra characters after command
(из-заp
), ноed
и последниеsed
предложения работают нормально.sed -n '1{/PATTERN/!q};p'
Сундук с инструментами POSIX:
источник
напечатает имя не скрытых
txt
файлов в текущем каталоге, первая строка которого соответствует расширенному регулярному выражениюpattern
с темиawk
поддержаниями, которые поддерживаютnextfile
.Если вместо печати имени файла вы хотите напечатать содержимое всего файла, вы можете сделать:
Это эффективно в том смысле, что он запускает только одну команду, но,
awk
будучи не самой эффективной командой для выгрузки содержимого файла с большими файлами, вы могли бы добиться лучшей производительности, выполнив что-то вроде:То есть используйте только
awk
для печати списка файлов, которые совпадают (с разделителями 0) и используютcat
для выгрузки своего содержимого.источник
Если вы пишете сценарий оболочки, вы могли бы что-то вроде
Или в Perl:
источник
close ARGV
это больше идиома, чем назначение$.
.Oldschool, просто переведите предложение в стандартные команды:
Для изучения Bash это хорошее начало. Если вам просто нужно быстрое решение, попробуйте sed-, awk- или perl-ответы. Оба хороши, но это собственные языки, которые вы должны (и, вероятно, хотите) выучить.
Это довольно простой пример, поэтому, если вы хотите узнать больше, вы можете попробовать то же самое в ruby, php, js (например, в nodejs) или любом другом языке, который разрешает доступ к файлам. Даже C / C ++ или Java должны легко управляться с небольшой задачей.
источник
if/else
вместо[ ] &&
.