From dced5f0d23b9c18528693335390340555a55e026 Mon Sep 17 00:00:00 2001 From: Gregory Chamberlain Date: Sun, 9 Aug 2020 12:45:12 +0100 Subject: [PATCH] Add function that counts chars in file --- README.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/README.md b/README.md index 1dd26d3..c7f64e3 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,7 @@ See something incorrectly described, buggy or outright wrong? Open an issue or s * [Parsing a `key=val` file.](#parsing-a-keyval-file) * [Get the first N lines of a file](#get-the-first-n-lines-of-a-file) * [Get the number of lines in a file](#get-the-number-of-lines-in-a-file) + * [Get the number of characters in a file](#get-the-number-of-characters-in-a-file) * [Count files or directories in directory](#count-files-or-directories-in-directory) * [Create an empty file](#create-an-empty-file) * [FILE PATHS](#file-paths) @@ -470,6 +471,40 @@ $ lines ~/.bashrc 48 ``` +## Get the number of characters in a file + +Alternative to `wc -c`. + +**Example Function:** + + +```sh +chars() { + # Usage: chars "file" + + # '|| [ -n "$line" ]': This ensures that lines + # ending with EOL instead of a newline are still + # operated on in the loop. + # + # 'read' exits with '1' when it sees EOL and + # without the added test, the line isn't sent + # to the loop. + while IFS= read -r line && chars=$((chars+1)) || [ -n "$line" ]; do + # "${#line}": Number of characters in '$line'. + chars=$((chars+${#line})) + done < "$1" + + printf '%s\n' "$chars" +} +``` + +**Example Usage:** + +```shell +$ chars ~/.bashrc +3526 +``` + ## Count files or directories in directory This works by passing the output of the glob to the function and then counting the number of arguments.