Last active
December 3, 2019 04:37
-
-
Save mark-ingenosity/b3e5478eee4d991ef260e6a00526a027 to your computer and use it in GitHub Desktop.
[BASH: Command Line FileSpec Parsing]Example script snippets for parsing complex file extensions passed on to a bash script command line #stack_overflow #bash #parse #command_line #arguments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/env bash | |
| https://stackoverflow.com/questions/965053/extract-filename-and-extension-in-bash | |
| filename=$(basename -- "$fullfile") | |
| extension="${filename##*.}" | |
| filename="${filename%.*}" | |
| altername that focusses on the last '/' rather than '.' | |
| filename="${fullfile##*/}" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| for fullpath in "$@" | |
| do | |
| filename="${fullpath##*/}" # Strip longest match of */ from start | |
| dir="${fullpath:0:${#fullpath} - ${#filename}}" # Substring from 0 thru pos of filename | |
| base="${filename%.[^.]*}" # Strip shortest match of . plus at least one non-dot char from end | |
| ext="${filename:${#base} + 1}" # Substring from len of base thru end | |
| if [[ -z "$base" && -n "$ext" ]]; then # If we have an extension and no base, it's really the base | |
| base=".$ext" | |
| ext="" | |
| fi | |
| echo -e "$fullpath:\n\tdir = \"$dir\"\n\tbase = \"$base\"\n\text = \"$ext\"" | |
| done |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/bin/bash | |
| https://stackoverflow.com/questions/965053/extract-filename-and-extension-in-bash | |
| Here are some alternative suggestions (mostly in awk), including some advanced use cases, like extracting version numbers for software packages. | |
| f='/path/to/complex/file.1.0.1.tar.gz' | |
| # Filename : 'file.1.0.x.tar.gz' | |
| echo "$f" | awk -F'/' '{print $NF}' | |
| # Extension (last): 'gz' | |
| echo "$f" | awk -F'[.]' '{print $NF}' | |
| # Extension (all) : '1.0.1.tar.gz' | |
| echo "$f" | awk '{sub(/[^.]*[.]/, "", $0)} 1' | |
| # Extension (last-2): 'tar.gz' | |
| echo "$f" | awk -F'[.]' '{print $(NF-1)"."$NF}' | |
| # Basename : 'file' | |
| echo "$f" | awk '{gsub(/.*[/]|[.].*/, "", $0)} 1' | |
| # Basename-extended : 'file.1.0.1.tar' | |
| echo "$f" | awk '{gsub(/.*[/]|[.]{1}[^.]+$/, "", $0)} 1' | |
| # Path : '/path/to/complex/' | |
| echo "$f" | awk '{match($0, /.*[/]/, a); print a[0]}' | |
| # or | |
| echo "$f" | grep -Eo '.*[/]' | |
| # Folder (containing the file) : 'complex' | |
| echo "$f" | awk -F'/' '{$1=""; print $(NF-1)}' | |
| # Version : '1.0.1' | |
| # Defined as 'number.number' or 'number.number.number' | |
| echo "$f" | grep -Eo '[0-9]+[.]+[0-9]+[.]?[0-9]?' | |
| # Version - major : '1' | |
| echo "$f" | grep -Eo '[0-9]+[.]+[0-9]+[.]?[0-9]?' | cut -d. -f1 | |
| # Version - minor : '0' | |
| echo "$f" | grep -Eo '[0-9]+[.]+[0-9]+[.]?[0-9]?' | cut -d. -f2 | |
| # Version - patch : '1' | |
| echo "$f" | grep -Eo '[0-9]+[.]+[0-9]+[.]?[0-9]?' | cut -d. -f3 | |
| # All Components : "path to complex file 1 0 1 tar gz" | |
| echo "$f" | awk -F'[/.]' '{$1=""; print $0}' | |
| # Is absolute : True (exit-code : 0) | |
| # Return true if it is an absolute path (starting with '/' or '~/' | |
| echo "$f" | grep -q '^[/]\|^~/' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment