озадачивающий egrep соответствует для символов новой строки

Я был очень озадаченным следующим egrep поведением:

У меня есть файл LF-terminated. Когда я grep для $ '\n' все линии возвращен как ожидалось. Но все линии возвращены, когда я grep для $ '\r\n' даже при том, что у меня нет возвратов каретки в файле. Почему делает grep, ведут себя этим озадачивающим способом?

[[email protected] myplay2]$ cat sample.txt
a
b
n
c
[[email protected] myplay2]$ file sample.txt
sample.txt: ASCII text
[[email protected] myplay2]$ egrep $'\n' sample.txt 
a
b
n
c
[[email protected] myplay2]$ egrep $'\r\n' sample.txt 
a
b
n
c

Кроме того, когда я преобразовываю файл в законченный CRLF, egreping для новых строк соответствует всем линиям, но egreping для carriagereturn+newline возвращает пустые строки. Почему?

[[email protected] myplay2]$ unix2dos sample.txt 
unix2dos: converting file sample.txt to DOS format ...
[[email protected] myplay2]$ file sample.txt 
sample.txt: ASCII text, with CRLF line terminators
[[email protected] myplay2]$ egrep $'\n' sample.txt 
a
b
n
c
[[email protected] myplay2]$ egrep $'\r\n' sample.txt 




[[email protected] myplay2]$ 

И наконец, если я egrep '\n' с сильными кавычками, но без спасения C-стиля, я становлюсь достойным "n" даже при том, что нет никакой наклонной черты влево. Почему?

[[email protected] myplay2]$ egrep '\n' sample.txt 
n
3
nl ja de

2 ответы

Первый egrep возвращает каждый ряд, потому что ваша раковина рассматривает $ '\n' как переменная, названная '\n'. Та переменная оценивает к пустой строке, и таким образом, egrep видит "egrep '' sample.txt". Это возвращает все ряды.

Я не думаю, grep или egrep позволяют соответствовать самих знаков конца линии. Они используют EOLs, чтобы сломать файл в линии, которые или соответствуйте или нет.

Вы могли использовать pcregrep, который будет использовать "жемчуг совместимые" регулярные выражения и будет счастливо соответствовать мультилинии regexes.

1
добавлено

Мог попробовать один из них

  -U, --binary              do not strip CR characters at EOL (MSDOS)
  -u, --unix-byte-offsets   report offsets as if CRs were not there (MSDOS)
0
добавлено
Linux Help
Linux Help
2 686 участник(ов)

Правила: https://telegra.ph/Pravila-Linux-Help-10-15

Linux Security
Linux Security
652 участник(ов)

Данная группа принципиально про безопасность и в частности про безопасность Linux. Прочие темы просим обсуждать в профильных чатах.

Linux Gaming RUS
Linux Gaming RUS
28 участник(ов)

Русскоязычный чатик, посвящённый играм на различных дистрибутивах Linux, а также wine, proton Arch Linux RU @ArchLinuxChatRU Gnome RU @gnome_ru