Вывести все строки, не содержащие знаков препинания

8

Я хочу шаблон регулярного выражения, который может печатать все строки, которые не содержат пунктуации:

Вход:

.This is line 1
This is ! line 2
This is line (3)
This is line 4

Вывод: (должно быть)

This is line 4

Что я пробовал до сих пор:

grep '[^[:punct:]]' file.txt

Но он показывает все символы, которые не являются пунктуацией.

Хамед Камрава
источник

Ответы:

11

Вы grepпечатаете все строки, содержащие знаки препинания. Это не то же самое, что печать всех строк, которые не содержат знаков препинания.

Для последнего вам нужен -vпереключатель (выводить строки, которые не соответствуют шаблону):

grep -v '[[:punct:]]' file.txt

Если по какой-то причине вы не хотите использовать этот -vпереключатель, вы должны убедиться, что вся строка состоит из знаков препинания:

grep '^[^[:punct:]]\+$' file.txt
Джозеф Р.
источник
+1 спасибо. Есть ли способ без использования -vпереключателя?
Хамед Камрава
@HamedKamrava Да. Пожалуйста, смотрите мое редактирование.
Джозеф Р.
@HamedKamrava Из любопытства: чего бы вы хотели избежать -v?
Бернхард
Я не избегаю, -vпросто хочу знать больше :)
Хамед Камрава,
@HamedKamrava Пожалуйста, не забудьте пометить этот ответ «Принят», если он решил вашу проблему.
Джозеф Р.
1

В sed вы можете сделать что-то вроде:

sed '/[[:punct:]]/!d'

В awk вы можете сделать:

awk '!/[[:punct:]]/'

ryekayo
источник
1

А Perl:

perl -nle 'print unless /\p{XPosixPunct}/' file

Это будет соответствовать -! "# $% & '() * +,. / :; <=> ? @ [\] ^ _` {|} ~, Который в Юникоде учитывает пунктуацию и символы.

или:

perl -nle 'print unless /\p{Punct}/' file

\p{Punct}только совпадения -! "#% & '() * ,. /:;? @ [\] _ {} , пропущено $ + <=> ^` | ~, которое в Юникоде учитывает символы.

perlпо умолчанию используется локаль POSIX. Если вы не используете perl, вы должны все так установить LC_ALL=POSIX, потому что разные локали могут иметь разные знаки пунктуации, такие как SAA Chas ¢.

cuonglm
источник