Search code examples
rubystringfilenames

Convert Ruby string to *nix filename-compatible string


In Ruby I have an arbitrary string, and I'd like to convert it to something that is a valid Unix/Linux filename. It doesn't matter what it looks like in its final form, as long as it is visually recognizable as the string it started as. Some possible examples:

"Here's my string!" => "Heres_my_string"
"* is an asterisk, you see" => "is_an_asterisk_you_see"

Is there anything built-in (maybe in the file libraries) that will accomplish this (or close to this)?


Solution

  • By your specifications, you could accomplish this with a regex replacement. This regex will match all characters other than basic letters and digits:

    s/[^\w\s_-]+//g
    

    This will remove any extra whitespace in between words, as shown in your examples:

    s/(^|\b\s)\s+($|\s?\b)/\\1\\2/g
    

    And lastly, replace the remaining spaces with underscores:

    s/\s+/_/g
    

    Here it is in Ruby:

    def friendly_filename(filename)
        filename.gsub(/[^\w\s_-]+/, '')
                .gsub(/(^|\b\s)\s+($|\s?\b)/, '\\1\\2')
                .gsub(/\s+/, '_')
    end