Регулярное выражение grep ^[^a]*$

sed 's/-1/9/g' file > file2
2
26.10.2019, 09:40
1 ответ

Вы не получите никакого результата, потому что ваше регулярное выражение ^[^a]*$(, которое должно быть заключено в одинарные кавычки, как и во второй попытке ), соответствует строкам, содержащим только не-aсимволы (или пустые строки ), а ваша текстовая строка не пуста и содержит a.

*действует на предыдущее выражение, [^a]в данном случае. [^a]*будет соответствовать нулю или более символам, отличным от -a. Поскольку вы привязываете выражение как к началу, так и к концу строки вокруг этого, оно отклоняет любую строку, содержащую букву a.

Для grepдля строк, которые начинаются с чего-то, что не является a, используйте

grep -r '^[^a]'.

Обратите внимание, что нет необходимости явно сопоставлять всю строку, но если вы хотите это сделать, используйте

grep -r '^[^a].*$'.

.*соответствует нулю или более из любого символа (, включаяa).

Чтобы также получить пустые строки в выводе (, они, очевидно, не начинаются сa):

grep -r -v '^a'.

То есть сопоставьте aв начале строки и инвертируйте смысл совпадения, используя -v. Таким образом, вам вообще не нужны символы в строке (обратите внимание, что для соответствия [^a]должен быть хотя бы один символ ), но если они есть, первый не должен быть a.

Для поиска слов , которые не начинаются с a, используйте

grep -r -w -o '[^a][[:alpha:]]*'.

Это выражение соответствует всему, что начинается с чего-либо, кроме a, а затем продолжается нулем или более буквенными символами. Опция -wдля GNU grepограничивает совпадения словами, а опция -oзапрашивает grepизвлекать только совпадающие части из каждой строки.

3
27.01.2020, 22:02

Теги

Похожие вопросы