Вы удачливы, что Ваш перебирающий жир о прописных буквах, поскольку пользовательские команды должны начаться с такого. В общем случае cmdalias.vim плагин предлагает способ создать произвольные псевдонимы. Это также прозрачно обработает все варианты аргумента :w {file}
, :w!
, и т.д.
С помощью GNU grep
, если он собран с поддержкой PCRE и предположить, что $string
не содержит \E
, можно сделать:
grep -P "^\Q$string"
Если ваши данные очень большими, Затем GREP
, вероятно, будет быстрее, чем более гибкие инструменты, такие как awk. То, что я бы сделал, это процитировать специальные символы в тексте и звоните GREP
.
pattern=$(printf '%s\n' "$literal_text" | sed 's/[\[.*^$]/\\&/g')
grep "^$pattern" my-big-file
Если текст содержит только символы ASCII, установите набор символов C, так что GREP только касается себя байтами. В некоторых реализациях (таких как многие версии GNU GREP) многобайтовые символы могут вызвать значительную скорость наказания.
LC_CTYPE=C grep "^$pattern" my-big-file
Если вы хотите найти точную целую строку, то есть вариант для этого: GREP -FX -E «$ lictal_text»
. Но это только соответствует строкам, которые состоят из именно указанного текста, нет аналогичного способа соответствия строкам, которые начинаются с указанного текста.
Если у вас нет слишком много шаблонов:
perl -ne 'BEGIN {$exp = quotemeta("miss.")} print if /^$exp/'
Я не знаю, как эффективно расширить это на GREP -F
(чтение шаблонов из файла, который Вы бы сделали, если бы у вас было серьезное количество шаблонов для решения), но Это так отвечает при объединении запросов, кажется интересным.
с awk
awk -vword='miss.' 'index($0, word) == 1' file
для нескольких слов
awk 'BEGIN{for (i=2; i<ARGC; ++i)word[++j]=ARGV[i]; ARGC=2}
{for (i=1; i<=j; ++i)if (index($0, word[i]) == 1){print; continue}}' file \
word1 word2 word3
Я также воображает Python
для этого
python3 -c 'import sys
words = tuple(sys.argv[1:])
for line in sys.stdin:
print(line if line.startswith(words) else "", end="")
' <file word1 word2 word3