grep "^$1"
вроде работает, но как мне избежать, "$1"
чтобы grep не интерпретировал в нем никаких символов?
Или есть лучший способ?
Редактировать:
я не хочу искать, '^$1'
но для динамически вставленной фиксированной строки, которая должна совпадать, только если она находится в начале строки. Вот что я имел в виду под $1
.
grep '^$1'
? Или вы не имели в виду, что хотите предотвратить$1
расширение оболочки?grep
тоже, но сначала вам придется экранировать любой специальный символ в вашей строке, напримерprintf %s ^;printf %s "$1" | sed 's/[][\.*^$]/\\&/g'; } | grep -f- infile
Ответы:
Я не могу придумать способ сделать это с помощью
grep
;^
Само по себе является частью регулярного выражения, поэтому его использование требует интерпретации регулярных выражений. Это тривиально , используя совпадение подстроки вawk
,perl
или что - то:Для обработки строк поиска, содержащих
\
, вы можете использовать тот же трюк, что и в ответе 123 :источник
\/
\\\/\/\/\\\\/
это видно\\///\\/
из программы. Насколько я знаю, в awk нет способа правильно избежать обратных слешей, если только вы не знаете, сколько из них будет использовано заранее.Если вам нужно только проверить, найдено ли совпадение, обрежьте все входные строки до длины желаемого префикса (
$1
) и затем используйте grep с фиксированным шаблоном:Также легко получить количество совпадающих строк:
Или номера строк всех совпадающих строк (номера строк начинаются с 1):
Вы можете передать номера строк
head
иtail
получить полный текст соответствующих строк, но в этот момент проще всего достичь современного языка сценариев, такого как Python или Ruby.(Приведенные выше примеры предполагают использование Posix grep и cut. Они предполагают, что файл для поиска поступает из стандартного ввода, но вместо этого может быть легко адаптирован для получения имени файла.)
Редактировать: Вы также должны убедиться, что pattern (
$1
) не является строкой нулевой длины. В противном случаеcut
не может сказатьvalues may not include zero
. Кроме того, если вы используете Bash, используйтеset -o pipefail
для перехвата ошибокcut
.источник
Способ использования Perl, который будет учитывать обратную косую черту
Это устанавливает переменную среды v для команды, а затем печатает, если индекс переменной равен 0, т.е. началу строки.
Вы также можете сделать то же самое в awk
источник
Вот вариант полностью bash, я не рекомендую bash для обработки текста, но он работает.
Сценарий вычисляет длину
len
введенного параметра $ 1, затем использует раскрытие параметра в каждой строке, чтобы увидеть, соответствуют ли первыеlen
символы $ 1. Если это так, он печатает строку.источник
Если у вас
$1
чистый ASCII и у васgrep
есть-P
опция (для включения PCRE), вы можете сделать это:Идея заключается в том, что
grep -P
регулярные выражения с помощью\xXX
позволяют указывать буквенные символы, гдеXX
это шестнадцатеричное значение ASCII этого символа. Символ соответствует буквально, даже если это специальный символ регулярного выражения.od
используется для преобразования ожидаемого начала строки в список шестнадцатеричных значений, которые затем соединяются вместе, каждое с префиксом\x
printf.^
Затем добавляется эта строка для построения необходимого регулярного выражения.Если у вас
$1
unicode, то это становится немного сложнее, потому что нет соответствия 1: 1 символов шестнадцатеричным байтам, выводимым с помощьюod
.источник
В качестве фильтра:
Запустить один или несколько файлов:
Раздел «Цитирование метасимволов» документации Perlre объясняет:
источник
Если ваш grep имеет опцию -P, что означает PCRE , вы можете сделать это:
Обратитесь к этому вопросу , и посмотрите документацию PCRE для подробностей, если хотите.
источник
Если есть символ, который вы не используете, вы можете использовать его, чтобы отметить начало строки. Например,
$'\a'
(ASCII 007). Это некрасиво, но это будет работатьЕсли вам не нужны совпадающие строки, вы можете оставить трейлинг
sed
и использоватьgrep -qF
. Но это намного проще сawk
(илиperl
) ...источник
Если вы хотите просмотреть файл без цикла, вы можете использовать:
Вырезать файл с длиной строки поиска
Ищите фиксированные строки и номера строк возврата
Используйте номера строк для чего-то вроде
sed -n '3p;11p' file
Если вы хотите удалить эти строки, используйте
источник