Как найти строки, которые содержат более одного пробела между строками в Unix? - PullRequest
6 голосов
/ 16 марта 2012

У меня есть такие строки, как

1|Harry|says|hi
2|Ron|says|bye
3|Her   mi oh ne|is|silent
4|The|above|sentence|is|weird

Мне нужна команда grep, которая обнаружит третью строку.

Это то, что я делаю.

grep -E '" "" "+' $dname".txt" >> $dname"_error.txt"

Логика, на которой я основываю это, состоит в том, что за первым пробелом должен следовать один или несколько пробелов, чтобы быть обнаруженными как ошибка.

$ dname - это переменная, которая содержит путь к имени файла.

Как получить желаемый результат?

(что является

      3|Her   mi oh ne|is|silent

)

Ответы [ 4 ]

7 голосов
/ 16 марта 2012
grep '[[:space:]]\{2,\}' ${dname}.txt >> ${dname}_error.txt

Если вы хотите поймать 2 или более пробелов.

4 голосов
/ 16 марта 2012

Просто так будет:

grep "  " ${dname}.txt >> ${dname}_error.txt

Два пробела в строке в кавычках работают нормально.-E превращает шаблон в расширенное регулярное выражение, что усложняет это здесь.

1 голос
/ 16 марта 2012

ниже четыре пути.

pearl.268> sed -n 's/  /&/p' ${dname}.txt >> ${dname}_error.txt
pearl.269> awk '$0~/  /{print $0}' ${dname}.txt >> ${dname}_error.txt
pearl.270> grep '  ' ${dname}.txt >> ${dname}_error.txt
pearl.271> perl -ne '/  / && print' ${dname}.txt >> ${dname}_error.txt
0 голосов
/ 16 марта 2012

Если вы хотите 2 или более пробелов, то:

grep -E "\s{2,}" ${dname}.txt >> ${dname}_error.txt

Причина, по которой ваш шаблон не работает, заключается в кавычках внутри. \s используется для [пробел]. Вы можете сделать то же самое с:

grep -E '  +' ${dname}.txt >> ${dname}_error.txt

Но сложно сказать, что именно вы ищете в этой версии. \s\s+ также будет работать, но \s{2,} является наиболее кратким и дает вам возможность установить верхний предел. Если вы хотите найти 2, 3 или 4 пробела подряд, вы должны использовать \s{2,4}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...