How to substitute "\" by "\/" using SED?


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting How to substitute "\" by "\/" using SED?
# 1  
Old 12-01-2008
How to substitute "\" by "\/" using SED?

Input: a/b/c
Output required: a\/b\/c

This does not work:
sed s/'\/'/'\//'/g
# 2  
Old 12-01-2008
Try:

sed 's!/!\\/!g'
# 3  
Old 12-01-2008
Thanks
How does this work? Can you please explain.
# 4  
Old 12-01-2008
Quote:
Originally Posted by dennis.jacob
Try:

sed 's!/!\\/!g'
Here ! is the seperater, it will look for the pattern "/" and replace it with \/. \ is escaped.
# 5  
Old 12-01-2008
OK a question:



Why this doesnt work:
node=`echo $node | sed 's!/!\\/!g'`
echo $node

output: a/b/c

But this works
echo $node | sed 's!/!\\/!g'
output: a\/b\/c
# 6  
Old 12-01-2008
Quote:
Originally Posted by indianjassi
Why this doesnt work:
[B]node=`echo $node | sed 's!/!\\/!g'`

But this works
echo $node | sed 's!/!\\/!g'
This is two times the same expression - either of the same variant works. ;-)

I suppose you want to know why this works and yours (from the first post) doesn't:

Normally (that is: out of habit) regular expressions are written with "/" as delimiter:

Code:
sed 's/<pattern>/<replacement>/'

but this is just a tradition, not enforced by the rules of regex language. You can use every character as delimiter, sed will take the character following the initial "s" and look for exactly the same character to determine where the parts of the regex end. The following example are all equivalent and will change an "x" to a "y".

Code:
s/x/y/
s@x@y@
s x y

You see that even a space character can act as delimiter (i do NOT recommend using a space, its just possible). Btw.: if the last example fails it is probably because you forgot the last character, a trailing space! Otherwise the regex would miss its delimiter. Use 's x y ' instead of 's x y'.

Now, regardless of which character we actually use as a delimiter, we always have a problem when we need to use the character literally (that is: NOT in its function as delimiter). To phrase it more generally (because this is really a very general principle): whenever we use a character to not adress the character itself but for some "other meaning" (like the asterisk, which means not an asterisk but "zero or more of the preceeding character") we have a problem when we want to use the character literally.

In the case of the delimiter character we could simply change the delimiter character - this is ultimately, what dennis.jacob did. But it is also possible to "flag" the character to tell the regex program it is not used in its function but merely as the character itself - in other words: to escape the character. This is usually done by preceeding the character in question with a backslash. The backslash tells sed that the following character should not be interpreted with its special meaning but simply as the character it is. The following example changes the "/" to "\/" without changing the delimiter character:

Code:
echo "a/b/c" | sed 's/\//\\\//g'

Lets talk this through, part by part:

s/ - so far, normal sed: the command (substitute) and the first delimiter
\/ - this is the slash, but escaped to tell sed it is not used as delimiter
/ - this is the delimiter, though
\\ - Because we use the backslash with a special meaning - to escape other characters - we need to escape itself too, to declare we want to use it literally. This is why a literal backslash is written "\\".
\/ - Again our slash, escaped to set it apart from the delimiter
/g - the delimiter and an eventual command to process all occurrences instead of just the first

I hope this helps.

bakunin
# 7  
Old 12-01-2008
Thanks for detailed explanation, bakunin!

Quote:
Originally Posted by bakunin
This is two times the same expression - either of the same variant works. ;-)
No there was a slight problem, I figured out myself why this didn't work:
node=`echo $node | sed 's!/!\\/!g'`
echo $node
a/b/c
I needed to put another "\" because the expression is enclosed in single quotes. When it expands it it escapes the \ and net effect is i am left with the same thing. So this works:
node=`echo $node | sed 's!/!\\\/!g'`
echo $node
a\/b\/c
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. AIX

Apache 2.4 directory cannot display "Last modified" "Size" "Description"

Hi 2 all, i have had AIX 7.2 :/# /usr/IBMAHS/bin/apachectl -v Server version: Apache/2.4.12 (Unix) Server built: May 25 2015 04:58:27 :/#:/# /usr/IBMAHS/bin/apachectl -M Loaded Modules: core_module (static) so_module (static) http_module (static) mpm_worker_module (static) ... (3 Replies)
Discussion started by: penchev
3 Replies

2. Shell Programming and Scripting

Bash script - Print an ascii file using specific font "Latin Modern Mono 12" "regular" "9"

Hello. System : opensuse leap 42.3 I have a bash script that build a text file. I would like the last command doing : print_cmd -o page-left=43 -o page-right=22 -o page-top=28 -o page-bottom=43 -o font=LatinModernMono12:regular:9 some_file.txt where : print_cmd ::= some printing... (1 Reply)
Discussion started by: jcdole
1 Replies

3. UNIX for Dummies Questions & Answers

Using "mailx" command to read "to" and "cc" email addreses from input file

How to use "mailx" command to do e-mail reading the input file containing email address, where column 1 has name and column 2 containing “To” e-mail address and column 3 contains “cc” e-mail address to include with same email. Sample input file, email.txt Below is an sample code where... (2 Replies)
Discussion started by: asjaiswal
2 Replies

4. Solaris

The slices "usr", "opt", "tmp" disappeared!!! Help please.

The system don't boot. on the screen appears following: press enter to maintenance (or type CTRL-D to continue)...I checked with format command. ... the slices "0-root","1-swap","2-backup" exist. ...the slises "3-var","6-usr" -unassigned. :( (16 Replies)
Discussion started by: wolfgang
16 Replies

5. Shell Programming and Scripting

how to use "cut" or "awk" or "sed" to remove a string

logs: "/home/abc/public_html/index.php" "/home/abc/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" "/home/xyz/public_html/index.php" how to use "cut" or "awk" or "sed" to get the following result: abc abc xyz xyz xyz (8 Replies)
Discussion started by: timmywong
8 Replies

6. Shell Programming and Scripting

awk command to replace ";" with "|" and ""|" at diferent places in line of file

Hi, I have line in input file as below: 3G_CENTRAL;INDONESIA_(M)_TELKOMSEL;SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL My expected output for line in the file must be : "1-Radon1-cMOC_deg"|"LDIndex"|"3G_CENTRAL|INDONESIA_(M)_TELKOMSEL"|LAST|"SPECIAL_WORLD_GRP_7_FA_2_TELKOMSEL" Can someone... (7 Replies)
Discussion started by: shis100
7 Replies

7. Shell Programming and Scripting

ps -ef | grep "string1" "string2" " "string3"

Hi all, can any one suggest me the script to grep multiple strings from ps -ef pls correct the below script . its not working/ i want to print OK if all the below process are running in my solaris system. else i want to print NOT OK. bash-3.00$ ps -ef | grep blu lscpusr 48 42 ... (11 Replies)
Discussion started by: steve2216
11 Replies

8. Shell Programming and Scripting

cat $como_file | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g'

hi All, cat file_name | awk /^~/'{print $1","$2","$3","$4}' | sed -e 's/~//g' Can this be done by using sed or awk alone (4 Replies)
Discussion started by: harshakusam
4 Replies

9. UNIX for Dummies Questions & Answers

Explain the line "mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'`"

Hi Friends, Can any of you explain me about the below line of code? mn_code=`env|grep "..mn"|awk -F"=" '{print $2}'` Im not able to understand, what exactly it is doing :confused: Any help would be useful for me. Lokesha (4 Replies)
Discussion started by: Lokesha
4 Replies
Login or Register to Ask a Question