Оболочка: как определить, что длина строк в текстовом файле не превышает 2048 байт - PullRequest
0 голосов
/ 27 мая 2018

Я понимаю, что очень маловероятно, что размер одной строки в текстовом файле органически превысил бы 2048 байт.Но я все еще думаю, что было бы очень полезно узнать, как убедиться, что это не так

Редактировать: Просто хотел сказать, что причина, по которой я задал этот вопрос, заключается в том, что я пишу скрипт, который проверяетчто файл является текстовым файлом, как определено POSIX.Одно из требований заключается в том, что длина строки в текстовом файле не должна превышать {LINE_MAX} байтов (включая новую строку).В Ubuntu и FreeBSD это значение равно 2048.

В GNU Linux вам не нужно беспокоиться об этом ограничении, поскольку оно допускает длину строки, ограниченную только памятью.FreeBSD, однако, налагает это ограничение, и я недавно предпринял серьезные усилия для изучения FreeBSD, поэтому я считаю, что для меня очень важно уметь это делать.

Редактировать: Я думаю, что ошибалсяFreeBSD.Я могу обрабатывать строки, длина которых превышает 2048 байт, с помощью grep

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы можете видеть, сколько строк слишком длинно:

cut -b 2049- < inputfile | grep -c '.'
# When you want to count chars, not bytes, use "-c"
cut -c 2049- < inputfile | grep -c '.'

Вы можете использовать это в функции

checkfile() {
   if [ $# -eq 2 ]; then
      overflow="$2"
   else
      overflow=2049
   fi
   cut -b "${overflow}" < "$1" | grep -c '.' > /dev/null
}

# Run test
testfile=/tmp/overflow.txt
echo "1234567890" > "${testfile}" # length 10, not counting '\n'
for boundary in 5 10 20; do
   echo "Check with maxlen ${boundary}"
   checkfile "${testfile}" ${boundary}
   if [ $? -eq 0 ]; then
      echo File OK
   else
      echo Overflow
   fi
   # example in check. Look out: the last ';' is needed.
   checkfile "${testfile}" ${boundary} || { echo "Your comment"; echo "can call exit now"; }
   # checkfile "${testfile}" ${boundary} || { echo "${testfile} has long lines" ; exit 1"; }
done
0 голосов
/ 27 мая 2018

Это буквально найдет количество байтов:

LANG=C grep -E '^.{2049}' some.txt

Например:

$ printf é | LANG=C grep -E '^.{2}'
é

Если вместо этого вы имеете в виду символов, используйте соответствующие LANG значение или не устанавливать его, чтобы полагаться на вашу оболочку по умолчанию:

$ printf é | LANG=en_US.utf8 grep -E '^.{2}'
$ echo $?
1

Если вы имеете в виду графемы , используйте this :

printf ? | grep -Px '\X{2}'
$ echo $?
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...