Следующий код использует tail
, чтобы проверить, не завершается ли последняя строка файла новой строкой (перевод строки, LF).
> printf 'aaa\nbbb\n' | test -n "$(tail -c1)" && echo pathological last line
> printf 'aaa\nbbb' | test -n "$(tail -c1)" && echo pathological last line
pathological last line
>
Можно проверить одно и то же условие, используя perl, регулярное выражение с положительным взглядом и unless
следующим образом. Это основано на том, что, если файл заканчивается символом новой строки, символ, непосредственно предшествующий концу файла, будет \n
по определению.
(Напомним, что флаг -n0
приводит к тому, что perl «обдувает» весь файл как одну запись. Таким образом, существует только один $
конец файла.)
> printf 'aaa\nbbb\n' | perl -n0 -e 'print "pathological last line\n" unless m/(?<=\n)$/;'
> printf 'aaa\nbbb' | perl -n0 -e 'print "pathological last line\n" unless m/(?<=\n)$/;'
pathological last line
>
Есть ли способ сделать это, используя if
вместо unless
и отрицательный взгляд назад? Следующее не удается, поскольку регулярное выражение, по-видимому, всегда соответствует:
> printf 'aaa\nbbb\n' | perl -n0 -e 'print "pathological last line\n" if m/(?<!\n)$/;'
pathological last line
> printf 'aaa\nbbb' | perl -n0 -e 'print "pathological last line\n" if m/(?<!\n)$/;'
pathological last line
>
Почему мое регулярное выражение всегда совпадает, даже если перед концом файла стоит символ новой строки? Я пытаюсь проверить конец файла, который не , которому предшествует символ новой строки.