Variable in sed


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Variable in sed
# 1  
Old 12-07-2015
RedHat Variable in sed

First post on this excellent forum.

I have problem using an variable in sed. I've been quoting until my eyes bleeds nowSmilie

I want to match IPV6 addresses and join it with the line that follows.
This works when i use it without an variable.
Code:
cat test.txt | sed -e '/^2001/{N;s/\n//;}'

But when i try to match with an variable that matches al kinds of IPV6 standards. The variable works when i try to grep with it so now problem there.

So how do i quote to make this work?
Code:
cat test.txt | sed -e '/^$IPV6CHECK/{N;s/\n//;}'

Example on text.txt
Code:
2001:0db8:0:1428::2
                  0 111029  522163 0    0     4w6d          3
2001:0db8:0:1429::2
                  0 51162  202540 0    0     3w3d          4
2001:0db8:0:1410::2
                  0 175342  597906 0    0    5d12h          7
2001:0db8:0:1411::2
                  0 53682  243980 0    0    5d12h          7
2001:0db8:0:1448::2
                  0 104945  601349 0    0     5w0d          4

Desired output:
Code:
2001:0db8:0:1428::2                  0 111029  522163 0    0     4w6d          3
2001:0db8:0:1429::2                  0 51162  202540 0    0     3w3d          4
2001:0db8:0:1410::2                  0 175342  597906 0    0    5d12h          7
2001:0db8:0:1411::2                  0 53682  243980 0    0    5d12h          7
2001:0db8:0:1448::2                  0 104945  601349 0    0     5w0d          4


Last edited by Scrutinizer; 12-08-2015 at 05:50 AM.. Reason: Adding code tags; removed spurious font tags
# 2  
Old 12-07-2015
Use double quotes to allow variable expansion.
Also, loose the cat , since it is useless here.
Code:
sed -e "/^$IPV6CHECK/{N;s/\n//;}" test.txt

Best regards
Peasant.
# 3  
Old 12-08-2015
Quote:
Originally Posted by Peasant
Use double quotes to allow variable expansion.
Also, loose the cat , since it is useless here.
Code:
sed -e "/^$IPV6CHECK/{N;s/\n//;}" test.txt

Best regards
Peasant.
Thanks for reply.
If it only had been that easy.
The variable has a complex regex. I think thats the problem. Varible works with grep

Code:
IPV6CHECK="(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))"
sed -e "/^$IPV6CHECK/{N;s/\n//;}" test.txt

Smilie
# 4  
Old 12-08-2015
Peasant is correct, you need the double quotes. In addition, IPV6CHECK contains a regular expression that is an ERE (extended regular expression), so it will work with grep -E. sed uses basic regular expressions (BRE) so it will not work there.

You can use GNU sed with the -r option or BSD sed with the -E option, that can handle ERE:
Code:
$ gsed -r "/^$IPV6CHECK/{N;s/\n//;}" infile
2001:0db8:0:1428::2                  0 111029  522163 0    0     4w6d          3
2001:0db8:0:1429::2                  0 51162  202540 0    0     3w3d          4
2001:0db8:0:1410::2                  0 175342  597906 0    0    5d12h          7
2001:0db8:0:1411::2                  0 53682  243980 0    0    5d12h          7
2001:0db8:0:1448::2                  0 104945  601349 0    0     5w0d          4

# 5  
Old 12-08-2015
Quote:
Originally Posted by Scrutinizer
Peasant is correct, you need the double quotes. In addition, IPV6CHECK contains a regular expression that is an ERE (extended regular expression), so it will work with grep -E. sed uses basic regular expressions (BRE) so it will not work there.

You can use GNU sed with the -r option or BSD sed with the -E option, that can handle ERE:
Code:
$ gsed -r "/^$IPV6CHECK/{N;s/\n//;}" infile
2001:0db8:0:1428::2                  0 111029  522163 0    0     4w6d          3
2001:0db8:0:1429::2                  0 51162  202540 0    0     3w3d          4
2001:0db8:0:1410::2                  0 175342  597906 0    0    5d12h          7
2001:0db8:0:1411::2                  0 53682  243980 0    0    5d12h          7
2001:0db8:0:1448::2                  0 104945  601349 0    0     5w0d          4

Thanks
I cant make it work on Redhat with sed -e. gsed is not available. It seams it wont match.

This is my test file.
Code:
#!/bin/bash
IPV6CHECK="(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))"
sed -e "/^$IPV6CHECK/{N;s/\n//;}" test.txt

I manage to make it work. But not in an pretty way Smilie
Code:
egrep -A1 "^$IPV6CHECK" test.sh | sed -e "s/ /_/g" | xargs -n 2 | awk '{ print $1,$2 }' | sed -e "s/_/ /g"

# 6  
Old 12-08-2015
Yes GNU sed is the default sed on Redhat Linux, so it is called sed and it should work there, but you need to use sed -r, not sed -e.

On my system it is called gsed that is why my example uses gsed.
This User Gave Thanks to Scrutinizer For This Post:
# 7  
Old 12-08-2015
Why is your IPV6CHECK that difficult? Wouldn't IPV6CHECK="([[:xdigit:]]*:){5}[[:xdigit:]]*" suffice?
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

How to use the variable in sed?

version=git release=r8 echo lp-testsuite-git-r8.x86_64.rpm |sed -e "s/-$version-$release.*//g" I want to get lp-testsuite what's wrong with me ? (1 Reply)
Discussion started by: yanglei_fage
1 Replies

2. Red Hat

How to pass value of pwd as variable in SED to replace variable in a script file

Hi all, Hereby wish to have your advise for below: Main concept is I intend to get current directory of my script file. This script file will be copied to /etc/init.d. A string in this copy will be replaced with current directory value. Below is original script file: ... (6 Replies)
Discussion started by: cielle
6 Replies

3. Shell Programming and Scripting

sed with variable

Hi Friends in sed whether we can use variable.like the following expression. sed -i 's/ABC/$var/g' filename I am using Kernel 2.6.18-194.11.1.el5 RedHat linux. I have tried sed -i 's/ABC/"$var"/g' filename, still not working.:( Please help. Thanks in advance Joy (2 Replies)
Discussion started by: itsjoy2u
2 Replies

4. Shell Programming and Scripting

Expand an environment variable in sed, when the variable contains a slash

I'm trying to make a sed substitution where the substitution pattern is an environment variable to be expanded, but the variable contains a "slash". sed -e 's/<HOME_DIRECTORY>/'$HOME'/'This gives me the following error: sed: -e expression #1, char 21: unknown option to `s'Obviously this is... (2 Replies)
Discussion started by: Ilja
2 Replies

5. Shell Programming and Scripting

Insert a line including Variable & Carriage Return / sed command as Variable

I want to instert Category:XXXXX into the 2. line something like this should work, but I have somewhere the wrong sytanx. something with the linebreak goes wrong: sed "2i\\${n}Category:$cat\n" Sample: Titel Blahh Blahh abllk sdhsd sjdhf Blahh Blah Blahh Blahh Should look like... (2 Replies)
Discussion started by: lowmaster
2 Replies

6. Shell Programming and Scripting

using variable in sed

i need to use a value in the Variable to print a particular line from a file using sed command. i tried the below one but its is not working sed -n ' "$var"p ' abc.txt but its is not working please help me to sort out this. (3 Replies)
Discussion started by: Kochu77
3 Replies

7. Shell Programming and Scripting

Sed variable substitution when variable constructed of a directory path

Hello, i have another sed question.. I'm trying to do variable substition with sed and i'm running into a problem. my var1 is a string constructed like this: filename1 filerev1 filepath1 my var2 is another string constructed like this: filename2 filerev2 filepath2 when i do... (2 Replies)
Discussion started by: alrinno
2 Replies

8. Shell Programming and Scripting

sed with a variable

Hi, My shell script searches a VALUE in a file, copies it to a variable and updates a line in another file with this new VALUE (replacing the old) The value has a pattern- VALUE=`$$MyDate=11-11-2008 09.09.56.123456` (yes the $ - . = and space are all part of the string) I am having... (6 Replies)
Discussion started by: ngagemaniac
6 Replies

9. Shell Programming and Scripting

sed (variable)

HOw can I use any variable in sed command. For example I am using 'sed -e 's/?/$ORACLE_HOME/g' $file_name Here it replaces ? with $ORACLE_HOME. Instead of it I need actual value of $ORACLE_HOME. How can I do that? Please advice. Thanks in advance. Malay (13 Replies)
Discussion started by: malaymaru
13 Replies

10. UNIX for Dummies Questions & Answers

Doing a sed on a variable help !

Hi, So what I'm trying to do is I have these variables and if they have a dot in them , I want everyting before and including the dot removed. Any ideas ? Something like this I would want : $var = $var | sed 's/.*\.//' but that does't work. I want to save that removal $var... (2 Replies)
Discussion started by: seaten
2 Replies
Login or Register to Ask a Question