Как извлечь числа (только цифры )из других слов в тексте с помощью bash

Из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и т. д., чтобы проверить, какой последний символ вашего входного файла.

0
19.04.2021, 23:44
2 ответа

Этот ответ основан на приведенном вами примере.
Это означает, что если числа перемежаются в файле 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 
0
28.04.2021, 22:52

попробуй:

printf '
Number of lines having one or more digits are: %d
Digits found:
%s
' "$(grep -Ecw '[[:digit:]]+' infile)" "$(grep -Eow '[[:digit:]]+' infile)"
0
28.04.2021, 22:52

Теги

Похожие вопросы