Изman 3 fgets
:
The fgets() function shall read bytes from stream into the array
pointed to by s, until n−1 bytes are read, or a is read and
transferred to s, or an end-of-file condition is encountered.
Таким образом, ваш код подсчитывает последнюю строку, независимо от того, был ли в конце символ новой строки (, которого нет ), потому что был обнаружен EOF. В конце концов, функция checkForNewLine()
проверяет нулевые символы, а не символы новой строки. Используйте od
, hexdump
и т. д., чтобы проверить, какой последний символ вашего входного файла.
Этот ответ основан на приведенном вами примере.
Это означает, что если числа перемежаются в файле example.txt
с разделителями, отличными от space
, ,
или ;
, скрипт, вероятно, выдаст вам неполные результаты. В любом случае, я обобщаю это решение для шаблонов разделения, которое допускает любую комбинацию пробела (s ), запятой (s )и точки с запятой (s ). Добавление различных разделителей тривиально, если они вам нужны.
$ cat my_script.bash
#!/usr/bin/env bash
printf "Number of lines having one or more digits is: %s\n" \
"$(grep -cE '(^| )[0-9]+( |,|;|$)' $1)"
printf "Digits found:\n"
printf "%s\n" "$(sed -E 's/ |\,|\;//g;' < <(grep -o -E '(^|( *|,|;)+)[0-9]+( |,|;|$)' $1))"
Я уверен, что можно полностью обойтись sed
, но grep
было слишком заманчиво в этом контексте.
Для использования сделайте файл my_script.bash
исполняемым и запустите:
$ chmod ug+x my_script.bash
$ my_script.bash example.txt
Number of lines having one or more digits are: 4
Digits found:
29809
165
23673
221965
065
1975
123
попробуй:
printf '
Number of lines having one or more digits are: %d
Digits found:
%s
' "$(grep -Ecw '[[:digit:]]+' infile)" "$(grep -Eow '[[:digit:]]+' infile)"