Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Remove part of path on Unix

I'm trying to remove part of the path in a string. I have the path:

/path/to/file/drive/file/path/ 

I want to remove the first part /path/to/file/drive and produce the output:

file/path/ 

Note: I have several paths in a while loop, with the same /path/to/file/drive in all of them, but I'm just looking for the 'how to' on removing the desired string.

I found some examples, but I can't get them to work:

echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive:\2:' echo /path/to/file/drive/file/path/ | sed 's:/path/to/file/drive:2' 

\2 being the second part of the string and I'm clearly doing something wrong...maybe there is an easier way?

like image 939
esausilva Avatar asked Jun 11 '12 20:06

esausilva


People also ask

How do you remove an entry from a PATH variable?

To remove a PATH from a PATH environment variable, you need to edit ~/. bashrc or ~/. bash_profile or /etc/profile or ~/. profile or /etc/bash.


2 Answers

If you wanted to remove a certain NUMBER of path components, you should use cut with -d'/'. For example, if path=/home/dude/some/deepish/dir:

To remove the first two components:

# (Add 2 to the number of components to remove to get the value to pass to -f) echo $path | cut -d'/' -f4- # output: # some/deepish/dir 

To keep the first two components:

echo $path | cut -d'/' -f-3 # output: # /home/dude 

To remove the last two components (rev reverses the string):

echo $path | rev | cut -d'/' -f4- | rev # output: # /home/dude/some 

To keep the last three components:

echo $path | rev | cut -d'/' -f-3 | rev # output: # some/deepish/dir 

Or, if you want to remove everything before a particular component, sed would work:

echo $path | sed 's/.*\(some\)/\1/g' # output: # some/deepish/dir 

Or after a particular component:

echo $path | sed 's/\(dude\).*/\1/g' # output: # /home/dude 

It's even easier if you don't want to keep the component you're specifying:

echo $path | sed 's/some.*//g' # output: # /home/dude/ 

And if you want to be consistent you can match the trailing slash too:

echo $path | sed 's/\/some.*//g' # output: # /home/dude 

Of course, if you're matching several slashes, you should switch the sed delimiter:

echo $path | sed 's!/some.*!!g' # output: # /home/dude 

Note that these examples all use absolute paths, you'll have to play around to make them work with relative paths.

like image 186
ACK_stoverflow Avatar answered Oct 12 '22 14:10

ACK_stoverflow


You can also use POSIX shell variable expansion to do this.

path=/path/to/file/drive/file/path/ echo ${path#/path/to/file/drive/} 

The #.. part strips off a leading matching string when the variable is expanded; this is especially useful if your strings are already in shell variables, like if you're using a for loop. You can strip matching strings (e.g., an extension) from the end of a variable also, using %.... See the bash man page for the gory details.

like image 35
evil otto Avatar answered Oct 12 '22 14:10

evil otto