use internal functions to speed up, not too effective in reading tho…
[shellsnippets/shellsnippets.git] / mksh / uri-grabber
1 #!/usr/bin/env mksh
2 # $MirOS: contrib/code/Snippets/uri-grabber.sh,v 1.3 2011/06/09 22:04:37 tg Exp $
3 #-
4 # Copyright (c) 2007, 2011
5 #       Thorsten Glaser <tg@mirbsd.de>
6 #
7 # Provided that these terms and disclaimer and all copyright notices
8 # are retained or reproduced in an accompanying document, permission
9 # is granted to deal in this work without restriction, including un-
10 # limited rights to use, publicly perform, distribute, sell, modify,
11 # merge, give away, or sublicence.
12 #
13 # This work is provided "AS IS" and WITHOUT WARRANTY of any kind, to
14 # the utmost extent permitted by applicable law, neither express nor
15 # implied; without malicious intent or gross negligence. In no event
16 # may a licensor, author or contributor be held liable for indirect,
17 # direct, other damage, loss, or other issues arising in any way out
18 # of dealing in the work, even if advised of the possibility of such
19 # damage or existence of a defect, except proven that it results out
20 # of said person's immediate fault when using the work as intended.
21 #-
22 # Grab URIs (RFC 2396) from stdin and output them, one per line. May
23 # contain false positives / negatives but has been tested. Requested
24 # to code by Vutral. No support for mailto: at the moment.
25
26 while read line; do
27         while [[ $line = *@(http|https|ftp)://* ]]; do
28                 beg=${line%%://*}
29                 case $beg {
30                 (*http)  beg=http ;;
31                 (*https) beg=https ;;
32                 (*ftp)   beg=ftp ;;
33                 (*)      continue ;;
34                 }
35                 line=${line#*://}
36                 p2=${line%%@([!#0-9a-zA-Z;/?:@&=+$,_.!~*\'()%-])*}
37                 line=${line#${p2}?}
38                 print "$beg://$p2"
39         done
40 done