in reply to Repeated substitution on 1 side of a line only

Assuming that the first  : (colon) is the separator between the "key" and "value" parts of a record (needs Perl version 5.10+ for  \K operator):

c:\@Work\Perl\monks>perl -wMstrict -le "use 5.010; ;; my @ra = ( 'session-redis-hosts-fault-tolerant: \"tyk-redis-1.gateways.svc.clu +ster.local,tyk-redis-2...\"', 'message-center-db: \"http://message-center-db-1b.message-center-db +.svc.cluster.local\"', 'a-b-c:d-e-f:g-h-i:j-k', ); ;; for my $s (@ra) { print qq{'$s'}; $s =~ s{ \G [^:]*? \K - (?= [^:]* :) }{_}xmsg; print qq{'$s' \n}; } " 'session-redis-hosts-fault-tolerant: "tyk-redis-1.gateways.svc.cluster +.local,tyk-redis-2..."' 'session_redis_hosts_fault_tolerant: "tyk-redis-1.gateways.svc.cluster +.local,tyk-redis-2..."' 'message-center-db: "http://message-center-db-1b.message-center-db.svc +.cluster.local"' 'message_center_db: "http://message-center-db-1b.message-center-db.svc +.cluster.local"' 'a-b-c:d-e-f:g-h-i:j-k' 'a_b_c:d-e-f:g-h-i:j-k'

Update: Actually, the look-ahead portion of
    $s =~ s{ \G [^:]*? \K - (?= [^:]* :) }{_}xmsg;
seems unnecessary. Changing the first inverted character class to  [^:-] is simpler:
    $s =~ s{ \G [^:-]* \K - }{_}xmsg;


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^2: Repeated substitution on 1 side of a line only
by dspivey (Initiate) on Dec 16, 2016 at 15:17 UTC

    Thank you for the reply. I was hoping that because I'm using in-line modification from the command line, that it could somehow be a 1-liner rather than a for loop?

    To answer your question, yes, the colon is the delimiter.

      The for-loop is just for the purpose of showing an example with various strings. Concentrate on the  s/// and what it's doing — and in particular, see the update. No reason the  s/// couldn't just be dropped into something like the one-liner you show in the OP.


      Give a man a fish:  <%-{-{-{-<

        Yep, that works! Thank you!

      I was hoping that because I'm using in-line modification from the command line, that it could somehow be a 1-liner
      REM Windows CMD prompt perl -F: -e "$F[0] =~ s/-/_/g; print join(':',@F);"
      # Linux/Unix/Cygwin shell perl -F: -e '$F[0] =~ s/-/_/g; print join(":",@F);'

      Disclaimer: Not tested.

      Explanation: -F: turns on auto-split (-a) and auto-loop (-n) and sets the split character to ':'