Очень плохо знаком с UNIX, но не новичок в программировании. Использование терминала на MacBook. В целях управления и поиска списков слов для построения кроссвордов, я пытаюсь разобраться с командой Grep и ее вариациями. Кажется довольно простым, но рано зацикливаться на том, что, как я думал, должно быть простым делом.
Когда я вхожу
grep "^COW" masternospaces.txt
Я получаю то, что хочу: список всех слов, начинающихся с COW.
Но когда я вхожу
grep "COW$" masternospaces.txt
Я ожидаю получить список слов, оканчивающихся на COW (таких слов много), и ничего не возвращается вообще.
Файл представляет собой простой текстовый файл, в каждой строке которого есть только слово (или словосочетание без пробелов) во всех заглавных буквах.
Есть идеи, что здесь может происходить?
hexdump
чтобы точно проверить, как отформатированы окончания строк. Я предлагаю вам использовать мой любимый формат:hexdump -e '"%08_ad (0x%08_ax) "8/1 "%02x "" "8/1 "%02x "' -e '" "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
. Получив выходные данные, проверьте окончания строк:0a
->LF
,0d
->CR
.Ответы:
Как упомянул @steeldriver, проблема, вероятно, вызвана тем, что стиль окончания строки отличается от
grep
ожидаемого.Чтобы проверить окончания строки
Вы можете использовать,
hexdump
чтобы точно проверить, как отформатированы окончания строк. Я предлагаю вам использовать мой любимый формат:Получив выходные данные, проверьте окончания строк:
0a
->LF
,0d
->CR
. Очень быстрый пример даст что-то вроде этого:Обратите внимание на концы строк в формате DOS:
0d 0a
.Чтобы изменить окончания строки
Вы можете увидеть здесь или здесь различные способы изменения конца строки с использованием различных инструментов, но для разовой работы вы всегда можете использовать vi / vim:
Grep, ничего не меняя
Если вы просто хотите
grep
соответствовать независимо от окончания строки, вы всегда можете указать окончание строки следующим образом:Если отображается пустая строка, вы можете проверить, что вы действительно что-то сопоставили, используя
-v
параметрcat
:Мой личный фаворит
Вы также можете как grep, так и стандартизировать вывод, используя
sed
:где
^M
получается, набравCtrl-V Ctrl-M
на клавиатуре.Надеюсь это поможет!
источник
[[:cntrl:]]
@ user43791, но он мне ничего не подходит. Это не имеет никакого смысла. Я использую GNU grep 2.20 и анализирую вывод из nDPI, который был записан в текстовый файлcat -v yourfile.ext
, что ты видишь?file
.Хотя вы можете использовать «стандартный» синтаксис RegEx с grep (как в ответе @ user43791 ), grep также имеет другие идентификаторы для обозначения входных границ.
Совпадения для начала и конца всей строки
\`
(обратный удар) (вместо^
) и\'
(апостроф) (вместо$
).Так что для вашей исходной команды вы должны использовать:
grep "COW\'" masternospaces.txt
Дополнительное примечание: также важно отметить, что
?
и+
будет рассматриваться буквально, если вы не избежите их использования\?
и не\+
сделаете их аналогами селектора в стиле RegEx.Источник:
grep
синтаксис регулярного выраженияисточник
Еще один способ удалить
\r
перед grep:Мне нравится, что это очень ясно, потому что я не помню такие вещи, как
[[:cntrl:]]
долго.источник
«COW $», когда bash установил параметр для grep, он интерпретировался как «COW», где обрабатывает «$» как «», поскольку $ является символом escape. когда $ не соответствует никому, это интерпретируется bash-оболочкой как пустая строка, поэтому вы должны использовать grep 'COW $' masternospaces.txt.
источник
$
, оно будет оставлено bash и использовано grep. Убедитесь сами:echo "COW$"
-$
все еще будет там.В BSD grep вам нужно экранировать "$" и заключать вашу строку в двойные кавычки:
источник
$
не будет особенным для оболочки, потому что содержимое после него не является допустимым именем переменной оболочки. Использование одинарных кавычек вокруг статических строк - лучшая идея, но здесь не будет никакой разницы.