#!/usr/local/bin/jsish -u %s var str = "abcdefgh"; var n = 2; var m = 3; // In jsish, semi-colon first character lines are echoed with result ;str; ;n; ;m; // * starting from n characters in and of m length; ;str.substr(n, m); // * starting from n characters in, up to the end of the string; ;str.substr(n); ;str.substring(n); // * whole string minus last character; ;str.substring(0, str.length - 1); // * starting from a known character within the string and of m length; ;str.substr(str.indexOf('b'), m); // * starting from a known substring within the string and of m length. ;str.substr(str.indexOf('bc'), m); /* Functional */ var res = (function () { 'use strict'; // take :: Int -> Text -> Text function take(n, s) { return s.substr(0, n); } // drop :: Int -> Text -> Text function drop(n, s) { return s.substr(n); } // init :: Text -> Text function init(s) { var n = s.length; return (n > 0 ? s.substr(0, n - 1) : undefined); } // breakOn :: Text -> Text -> (Text, Text) function breakOn(strPattern, s) { var i = s.indexOf(strPattern); return i === -1 ? [strPattern, ''] : [s.substr(0, i), s.substr(i)]; } var str = 'abcdefgh'; return JSON.stringify({ 'from 4 in, of 3 length': (function (n, m) { return take(m, drop(n, str)); })(4, 3), 'from 3 in, up to end' : (function (n) { return drop(n, str); })(3), 'all but last' : init(str), 'from matching b, of length 3' : (function (pattern, s, n) { return take(n, breakOn(pattern, s)[1]); })('b', str, 3), 'from matching bc, of length 4':(function (pattern, s, n) { return take(n, breakOn(pattern, s)[1]); })('bc', str, 4) }, true); })(); ;res;