grep: недопустимая обратная ссылка при попытке найти палиндром - PullRequest
0 голосов
/ 30 сентября 2019

У меня есть сценарий bash, в котором я пытаюсь распознать палиндромы из данного файла words.txt, я думаю, что я на правильном пути, используя grep, но я не уверен. Я должен использовать только классы символов, такие как \w или [:alpha:], чтобы ссылаться на буквы в алфавите, но всякий раз, когда я пытаюсь выполнить программу, я получаю сообщение об ошибке:

grep: Invalidобратная ссылка.

Кто-нибудь сможет пролить свет на то, как решить эту проблему? Спасибо!

РЕДАКТИРОВАТЬ: мой новый код, но теперь регулярное выражение 3 (почти работает, но дает мне дополнительное слово, которое я не должен) и 5 ​​(ничего не делает) не делают то, что они должны,любая помощь, пожалуйста?

#!/bin/bash

src_file="words.txt"

regex1='^(.)(.).\2\1'
regex2='^(.)(.)(.)\3\2\1'
regex3='^(.)(.)(.).\3\2\1'
regex4='(.)\1+'
regex5='^(.)\1{2}'

echo 'These are the five letter palindromes:'
egrep $regex1 $src_file

echo ' '
echo 'These are the six letter palindromes:'
egrep $regex2 $src_file

echo ' '
echo 'These are the seven letter palindromes:'
egrep $regex3 $src_file

echo ' '
echo 'These are the words that contain at least two instances of the same doubled characters (such as willfully (contains ll twice) and riffraff (contains ff twice)):'
egrep $regex4 $src_file

echo ' '
echo 'These are the words that contain at least three instances of doubled characters (such as bookkeeper  (oo, kk, and ee) and keenness (ee, nn, and ss):'
egrep $regex5 $src_file

1 Ответ

0 голосов
/ 30 сентября 2019

Ваш regex3 выглядит почти нормально, но возможное совпадение будет иметь место с такими словами, как wow wow или revivers. Тогда, пожалуйста, попробуйте:

regex3='^(.)(.)(.)\w\3\2\1$'

Чтобы быть строгим, будет безопаснее заменить все точки на \w, так как:

regex3='^(\w)(\w)(\w)\w\3\2\1$'

Само собой разумеется, что требуется привязка $для regex1 и regex2.

По состоянию на regex4 должно быть:

regex4='(\w)\1.*\1\1'

или

regex4='((\w)\2).*\1'

, чтобы соответствовать willfullyи riffraff.

и regex5 должны быть:

regex5='(\w)\1.*(\w)\2.*(\w)\3'

, чтобы соответствовать bookkeeper и keenness.

Обратите внимание, что класс символов \w эквивалентно [[:alnum:]]. Если вы хотите ограничить соответствие только алфавитами, замените \w на [[:alpha:]].

Кстати, вы также можете проверить, является ли переменная $str палиндромом с:

[[ $str = $(rev <<< "$str") ]] && echo "$str is a palindrome"

как альтернатива.

Надеюсь, это поможет.

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