-
-
Save jag3773/5797912d1fc6616e55af88a6d10c6d41 to your computer and use it in GitHub Desktop.
| #!/usr/bin/env bash | |
| # This turns natural references into wiki link references like this: | |
| # Genesis 12:3 -> [[Genesis 12#12:3]] | |
| # Psalm 119:9-11 -> [[Psalm 119#119:9-11]] | |
| # 1 John 3 -> [[1 John 3]] | |
| # First John 1 -> [[1 John 1]] | |
| # Put this file into .git/hooks/ and it will run every time you | |
| # commit into your repository. Make sure it is executable, you can run | |
| # chmod +x .git/hooks/pre-commit | |
| # Requires the gsed utility on Mac. For Linux, change `gsed` to `sed` below (line 63). | |
| ### BEGIN USER CONFIG ### | |
| # You need to fill in the path to your git-backed Obsidian vault. | |
| PATHTOVAULT= | |
| # Where are your markdown files? Uncomment the option you want | |
| #MARKDOWNFILES="*/*.md" # look 1 directory deep | |
| #MARKDOWNFILES="resources/notes/*.md" # only look in the notes directory | |
| ### END USER CONFIG ### | |
| cd "$PATHTOVAULT" | |
| GREPREGEX='[0-9][0-9]*[ ,;.:?)]' | |
| SEDVSREGEX='\([0-9]*\)\(:[0-9]*[-0-9]*\)/\[\[\1 \2#\2\3\]\]/g' | |
| SEDCPREGEX='\([0-9]*\)\([ ,;.]\)/\[\[\1 \2\]\]\3/g' | |
| IFS=$'\n' | |
| for x in `/usr/bin/grep -l -i \ | |
| -e "[123] [JPTCSKjptcsk][a-z]* $GREPREGEX" \ | |
| -e "[Ff]irst [JPTCSKjptcsk][a-z]* $GREPREGEX" \ | |
| -e "[Ss]econd [JPTCSKjptcsk][a-z]* $GREPREGEX" \ | |
| -e "[Tt]hird [JPTCSKjptcsk][a-z]* $GREPREGEX" \ | |
| -e "[123][snr][td] [JPTCSKjptcsk][a-z]* $GREPREGEX" \ | |
| -e "Genesis $GREPREGEX" -e "Exodus $GREPREGEX" \ | |
| -e "Leviticus $GREPREGEX" -e "Numbers $GREPREGEX" \ | |
| -e "Deuteronomy $GREPREGEX" -e "Joshua $GREPREGEX" \ | |
| -e "Judges $GREPREGEX" -e "Ruth $GREPREGEX" \ | |
| -e "Ezra $GREPREGEX" -e "Nehemiah $GREPREGEX" \ | |
| -e "Esther $GREPREGEX" -e "Job $GREPREGEX" \ | |
| -e "Psalms* $GREPREGEX" -e "Proverbs $GREPREGEX" \ | |
| -e "Ecclesiastes $GREPREGEX" -e "Song of Solomon $GREPREGEX" \ | |
| -e "Isaiah $GREPREGEX" -e "Jeremiah $GREPREGEX" \ | |
| -e "Lamentations $GREPREGEX" -e "Ezekiel $GREPREGEX" \ | |
| -e "Daniel $GREPREGEX" -e "Hosea $GREPREGEX" \ | |
| -e "Joel $GREPREGEX" -e "Amos $GREPREGEX" \ | |
| -e "Obadiah $GREPREGEX" -e "Jonah $GREPREGEX" \ | |
| -e "Micah $GREPREGEX" -e "Nahum $GREPREGEX" \ | |
| -e "Habakkuk $GREPREGEX" -e "Zephaniah $GREPREGEX" \ | |
| -e "Haggai $GREPREGEX" -e "Zechariah $GREPREGEX" \ | |
| -e "Malachi $GREPREGEX" -e "Matthew $GREPREGEX" \ | |
| -e "Mark $GREPREGEX" -e "Luke $GREPREGEX" \ | |
| -e "John $GREPREGEX" -e "Acts $GREPREGEX" \ | |
| -e "Romans $GREPREGEX" -e "Galatians $GREPREGEX" \ | |
| -e "Ephesians $GREPREGEX" -e "Philippians $GREPREGEX" \ | |
| -e "Colossians $GREPREGEX" -e "Titus $GREPREGEX" \ | |
| -e "Philemon $GREPREGEX" -e "Hebrews $GREPREGEX" \ | |
| -e "James $GREPREGEX" -e "Jude $GREPREGEX" -e "Revelation $GREPREGEX" \ | |
| ${MARKDOWNFILES}`; do | |
| gsed -i \ | |
| -e "s/\([123] [JPTCSKjptcsk][a-z]*\) $SEDVSREGEX" \ | |
| -e "s/[Ff]irst \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\(:[0-9]*[-0-9]*\)/\[\[1 \1 \2#\2\3\]\]/g" \ | |
| -e "s/[Ss]econd \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\(:[0-9]*[-0-9]*\)/\[\[2 \1 \2#\2\3\]\]/g" \ | |
| -e "s/[Tt]hird \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\(:[0-9]*[-0-9]*\)/\[\[3 \1 \2#\2\3\]\]/g" \ | |
| -e "s/\([123]\)[snr][td] \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\(:[0-9]*[-0-9]*\)/\[\[\1 \2 \3#\3\4\]\]/g" \ | |
| -e "s/\(Genesis\) $SEDVSREGEX" -e "s/\(Exodus\) $SEDVSREGEX" \ | |
| -e "s/\(Leviticus\) $SEDVSREGEX" -e "s/\(Numbers\) $SEDVSREGEX" \ | |
| -e "s/\(Deuteronomy\) $SEDVSREGEX" -e "s/\(Joshua\) $SEDVSREGEX" \ | |
| -e "s/\(Judges\) $SEDVSREGEX" -e "s/\(Ruth\) $SEDVSREGEX" \ | |
| -e "s/\(Ezra\) $SEDVSREGEX" -e "s/\(Nehemiah\) $SEDVSREGEX" \ | |
| -e "s/\(Esther\) $SEDVSREGEX" -e "s/\(Job\) $SEDVSREGEX" \ | |
| -e "s/\(Psalms*\) $SEDVSREGEX" -e "s/\(Proverbs\) $SEDVSREGEX" \ | |
| -e "s/\(Ecclesiastes\) $SEDVSREGEX" -e "s/\(Song of Solomon\) $SEDVSREGEX" \ | |
| -e "s/\(Isaiah\) $SEDVSREGEX" -e "s/\(Jeremiah\) $SEDVSREGEX" \ | |
| -e "s/\(Lamentations\) $SEDVSREGEX" -e "s/\(Ezekiel\) $SEDVSREGEX" \ | |
| -e "s/\(Daniel\) $SEDVSREGEX" -e "s/\(Hosea\) $SEDVSREGEX" \ | |
| -e "s/\(Joel\) $SEDVSREGEX" -e "s/\(Amos\) $SEDVSREGEX" \ | |
| -e "s/\(Obadiah\) $SEDVSREGEX" -e "s/\(Jonah\) $SEDVSREGEX" \ | |
| -e "s/\(Micah\) $SEDVSREGEX" -e "s/\(Nahum\) $SEDVSREGEX" \ | |
| -e "s/\(Habakkuk\) $SEDVSREGEX" -e "s/\(Zephaniah\) $SEDVSREGEX" \ | |
| -e "s/\(Haggai\) $SEDVSREGEX" -e "s/\(Zechariah\) $SEDVSREGEX" \ | |
| -e "s/\(Malachi\) $SEDVSREGEX" -e "s/\(Matthew\) $SEDVSREGEX" \ | |
| -e "s/\(Mark\) $SEDVSREGEX" -e "s/\(Luke\) $SEDVSREGEX" \ | |
| -e "s/\(John\) $SEDVSREGEX" -e "s/\(Acts\) $SEDVSREGEX" \ | |
| -e "s/\(Romans\) $SEDVSREGEX" -e "s/\(Galatians\) $SEDVSREGEX" \ | |
| -e "s/\(Ephesians\) $SEDVSREGEX" -e "s/\(Philippians\) $SEDVSREGEX" \ | |
| -e "s/\(Colossians\) $SEDVSREGEX" -e "s/\(Titus\) $SEDVSREGEX" \ | |
| -e "s/\(Philemon\) $SEDVSREGEX" -e "s/\(Hebrews\) $SEDVSREGEX" \ | |
| -e "s/\(James\) $SEDVSREGEX" -e "s/\(Jude\) $SEDVSREGEX" \ | |
| -e "s/\(Revelation\) $SEDVSREGEX" \ | |
| -e "s/\([123] [JPTCSKjptcsk][a-z]*\) $SEDCPREGEX" \ | |
| -e "s/[Ff]irst \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\([ ,;.]\)/\[\[1 \1 \2\]\]/g" \ | |
| -e "s/[Ss]econd \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\([ ,;.]\)/\[\[2 \1 \2\]\]/g" \ | |
| -e "s/[Tt]hird \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\([ ,;.]\)/\[\[3 \1 \2\]\]/g" \ | |
| -e "s/\([123]\)[snr][td] \([JPTCSKjptcsk][a-z]*\) \([0-9]*\)\([ ,;.]\)/\[\[\1 \2 \3\]\]/g" \ | |
| -e "s/\(Genesis\) $SEDCPREGEX" -e "s/\(Exodus\) $SEDCPREGEX" \ | |
| -e "s/\(Leviticus\) $SEDCPREGEX" -e "s/\(Numbers\) $SEDCPREGEX" \ | |
| -e "s/\(Deuteronomy\) $SEDCPREGEX" -e "s/\(Joshua\) $SEDCPREGEX" \ | |
| -e "s/\(Judges\) $SEDCPREGEX" -e "s/\(Ruth\) $SEDCPREGEX" \ | |
| -e "s/\(Ezra\) $SEDCPREGEX" -e "s/\(Nehemiah\) $SEDCPREGEX" \ | |
| -e "s/\(Esther\) $SEDCPREGEX" -e "s/\(Job\) $SEDCPREGEX" \ | |
| -e "s/\(Psalms*\) $SEDCPREGEX" -e "s/\(Proverbs\) $SEDCPREGEX" \ | |
| -e "s/\(Ecclesiastes\) $SEDCPREGEX" -e "s/\(Song of Solomon\) $SEDCPREGEX" \ | |
| -e "s/\(Isaiah\) $SEDCPREGEX" -e "s/\(Jeremiah\) $SEDCPREGEX" \ | |
| -e "s/\(Lamentations\) $SEDCPREGEX" -e "s/\(Ezekiel\) $SEDCPREGEX" \ | |
| -e "s/\(Daniel\) $SEDCPREGEX" -e "s/\(Hosea\) $SEDCPREGEX" \ | |
| -e "s/\(Joel\) $SEDCPREGEX" -e "s/\(Amos\) $SEDCPREGEX" \ | |
| -e "s/\(Obadiah\) $SEDCPREGEX" -e "s/\(Jonah\) $SEDCPREGEX" \ | |
| -e "s/\(Micah\) $SEDCPREGEX" -e "s/\(Nahum\) $SEDCPREGEX" \ | |
| -e "s/\(Habakkuk\) $SEDCPREGEX" -e "s/\(Zephaniah\) $SEDCPREGEX" \ | |
| -e "s/\(Haggai\) $SEDCPREGEX" -e "s/\(Zechariah\) $SEDCPREGEX" \ | |
| -e "s/\(Malachi\) $SEDCPREGEX" -e "s/\(Matthew\) $SEDCPREGEX" \ | |
| -e "s/\(Mark\) $SEDCPREGEX" -e "s/\(Luke\) $SEDCPREGEX" \ | |
| -e "s/\(John\) $SEDCPREGEX" -e "s/\(Acts\) $SEDCPREGEX" \ | |
| -e "s/\(Romans\) $SEDCPREGEX" -e "s/\(Galatians\) $SEDCPREGEX" \ | |
| -e "s/\(Ephesians\) $SEDCPREGEX" -e "s/\(Philippians\) $SEDCPREGEX" \ | |
| -e "s/\(Colossians\) $SEDCPREGEX" -e "s/\(Titus\) $SEDCPREGEX" \ | |
| -e "s/\(Philemon\) $SEDCPREGEX" -e "s/\(Hebrews\) $SEDCPREGEX" \ | |
| -e "s/\(James\) $SEDCPREGEX" -e "s/\(Jude\) $SEDCPREGEX" \ | |
| -e "s/\(Revelation\) $SEDCPREGEX" \ | |
| $x | |
| done | |
| exit 0 |
That could depend on how you have your vault folder structure. "PATHTOYOURVAULT" above should go to the root of your vault and then the script assumes 1 layer of directories and markdown folders below that. For example, at the root of my vault I have:
- notes
- archives
- etc.
Below each of those I have my markdown files. You might need to modify that line if your markdown files are in a different location.
Note that the [na] part means that it will only look at directories starting with an a or n -- in my case I only want to run this in my notes and archives directories. You probably will need to change that based on your directory names.
I changed the latest version (revision 6) to only reference */*.md which should make it more usable for others.
I just added support for references like "First John 3:2" or "2nd Samuel 3" to support my speech to text engine which isn't consistent.
Added support for entries like "first chronicles" which were not working previously. Also added a USER CONFIG section to make it easier to define the path to your vault and the search path for Markdown files.
When testing this from the terminal with a file
Bible Ref link test.mdthat contains the following content:I get the following error:
grep: [na]*/*.md: No such file or directory