Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people, just like you, are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions

windows to linux path delimeters and case substitution in cpp code

Posted on 2010-11-11
Last Modified: 2012-05-10

I have received a significant amount of cpp that was developed on windows and now needs to be compiled on Linux. My main focus for the time being is to modify paths and case in file names within paths.

The paths are easy with the sharp end of the stick doing the following sed within a series of loops in my bash script:

sed -i 's#\\#/#' <path/filename>

Could anyone ease my frustration with substituting uppercase but only in string matches where windows path delimiters can be found? Fortunately I have been unable  to find whitespace in paths...yet.

SYSTEMINCLUDE \root\subdir_A\Component\Include\stdapis
subs to:
SYSTEMINCLUDE /root/subdir_a/component/include/stdapis

Question by:dingdangdo
  • 5
  • 2

Expert Comment

ID: 34120527
Something simple like this would work fine, I imagine?

grep "SYSTEMINCLUDE" file.c | tr '[:upper:]' '[:lower:]'

Just run your inital sed script to convert slashes and run that after.  I imagine you have an if statement already that checks if the given header file is in windows format vs *nux format, so you could alternatively just tack on the tr command after the sed statement:

sed -i 's#\\#/#' <path/filename> | tr '[:upper:]' '[:lower:]'

Unsure if that's entirely what you're looking for, but given what you said that's my initial take.

Accepted Solution

dingdangdo earned 0 total points
ID: 34140144
Hi Vryali,

Many thanks for the contrib. It's just the path strings I wanted to do the substitution in. I ended up with it in python. The key line is:

It could have ben done in shell using sed. 'Just the way it went on the day :-)


#! /usr/bin/python

import os
import re
import sys
import datetime
import time
import shutil
import inspect
import glob
import traceback
import copy

verboseOutput = False
doOutFileCopy = True

modified = False
shownFilename = False

# --------------------------------------------------------------

def recurseReplace( line ):
    global shownFilename
    reRes = repattern.match(line.replace('\\', '/'));      
    if( reRes ):

        if verboseOutput:
            print " *** regex match *** "

        line = reRes.group('head') + reRes.group('path').lower() + recurseReplace( reRes.group('tail') )

    return line

# --------------------------------------------------------------

fileName = None
if (len(sys.argv) < 2):
    fileName = sys.argv[1]
    fileOut = fileName + '.out'

repattern = re.compile(r"^(?P<head>.*?)(?P<path>[^/]/[^/][/|a-z|A-Z|_|\-|0-9|\.]+)(?P<tail>.*)$");
# print "=== Opening file: " + fileName
fIn = open( fileName )
fOut= open( fileOut, "w" )

for line in fIn:
    lineEnd = "\n\r"
    if( line.find("\n\r") >= 0 ):
        lineEnd = "\n\r"
    elif( line.find("\r\n") >= 0 ):
        lineEnd = "\r\n"
    elif( line.find("\r") >= 0 ):
        lineEnd = "\r"
    elif( line.find("\n") >= 0 ):
        lineEnd = "\n"

    line = line.replace("\n", "").replace("\r", "")
    if verboseOutput:
        print line

    newLine = recurseReplace( line )
    fOut.write( newLine + lineEnd )
    if newLine != line:
        if shownFilename == False:
            print "=== Opening file: " + fileName
            shownFilename = True
        print ' Changed "' + line + '" to "' + newLine + '"'
        modified = True


if( modified == False ):
    os.remove( fileOut )
elif doOutFileCopy:
        os.remove( fileOut + ".orig"  )
        fukit = True
    os.rename( fileName, fileName + ".orig" )
    os.rename( fileOut, fileName )

Expert Comment

ID: 34140280
He found the solution himself and worked it out as a Rube Goldberg-esque solution, and it apparently works (Didn't go through his code).  His closing comment bit though is:

"Hope I don't get these points. I've only asked 2 questions. Wasn't expecting to find the solution ot this one myself."

I'm objecting because it looks like he's stating that I should have gotten the points (since he hopes he doesn't get them and I'm the other response/simpler response.

I'm not really sure, he got the right answer in another fashion, but it looks like he wanted me to get the points?  I don't mind not getting the points... Just sayin'.  Happily would withdraw my objection (If you can even do that?) if he was intending to give out zero points since he found the correct answer on his own...?
Microsoft Certification Exam 74-409

Veeam® is happy to provide the Microsoft community with a study guide prepared by MVP and MCT, Orin Thomas. This guide will take you through each of the exam objectives, helping you to prepare for and pass the examination.


Expert Comment

ID: 34140296
Ah, I didn't realize it would post that publicly, I feel like an ass now; Damn you Experts-Exchange  for not giving me an edit or delete button that I can find...

Author Comment

ID: 34140482
Hi Vryali,

I am sorry you didn't receive points but your solution wasn't what I was after. I must only substitute case in the <path>/<filename> portions of each line as stated in the example I submitted:

SYSTEMINCLUDE \root\subdir_A\Component\Include\stdapis
subs to:
SYSTEMINCLUDE /root/subdir_a/component/include/stdapis

Your solution would have yielded:
systeminclude /root/subdir_a/component/include/stdapis

Many thanks though for taking the time on it. BTW as I hoped I didn't get the points. It wouldn't be right to be rewarded for answering my own question.



Expert Comment

ID: 34140873
Ah cheers,i was just confused by the wording, my apologies

Expert Comment

ID: 34140884
Ah cheers,i was just confused by the wording, my apologies

Expert Comment

ID: 34179136
Following an 'Objection' by Vryali (at http://www.experts-exchange.com/Q_26616568.html) to the intended closure of this question, it has been reviewed by at least one Moderator and is being closed as originally requested by the author.
Thank you,
Community Support Moderator

Featured Post

Free learning courses: Active Directory Deep Dive

Get a firm grasp on your IT environment when you learn Active Directory best practices with Veeam! Watch all, or choose any amount, of this three-part webinar series to improve your skills. From the basics to virtualization and backup, we got you covered.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
AWS- KeepAlived notify script not working 23 103
Like to learn Linux, need advice for a good book and setup. 3 55
linux SFTP 8 59
parse a file and get data out 11 72
A year or so back I was asked to have a play with MongoDB; within half an hour I had downloaded (http://www.mongodb.org/downloads),  installed and started the daemon, and had a console window open. After an hour or two of playing at the command …
I. Introduction There's an interesting discussion going on now in an Experts Exchange Group — Attachments with no extension (http://www.experts-exchange.com/discussions/210281/Attachments-with-no-extension.html). This reminded me of questions tha…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…

790 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question