use sed in shell script to replace IP Address in a file
To negate a range in a regular expression, the caret must be inside the square brackets.
sed -i -r 's/$old_string([^0-9])+/$new_string/g' $FILENAME
The parentheses are also unnecessary in this case if you are not using backreferences (and it doesn't look like you are.)
sed -i -r 's/$old_string[^0-9]+/$new_string/g' $FILENAME
One last thing: bash doesn't parse variables inside single-quotes, so $old_string
and $new_string
will not be replaced by any bash variable you may have set in your script but will be used literally in that sed
command. If you use double-quotes, they will be replaced.
sed -i -r "s/$old_string[^0-9]+/$new_string/g" $FILENAME
Update:
Since the file doesn't contain anything after the string you want to replace, the [^0-9]+
part of the regex has nothing to match. It would work if there was a space after the IP address. We can match the end of the line instead with $
.
sed -i -r 's/123.123.123.1$/4.4.4.4/g' $FILENAME
One more update. This one matches any character that isn't a number or no characters at all. For this one we need the parentheses to group the two options.
sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4/g' $FILENAME
Since we have the parentheses, you can use a backreference to include whatever was matched:
sed -i -r 's/123.123.123.1([^0-9]+|$)/4.4.4.4\1/g' $FILENAME
Related videos on Youtube
edotan
Updated on September 18, 2022Comments
-
edotan over 1 year
I have a script that finds a string in a file replaces it with a new string.
$ sed -i 's/$old_string'/'$new_string'/g' $FILENAME
Now I need the condition to be a regular expression that also check whether the old string is followed with anything but a number.
I tried this but it didn't work:
$ sed -i -r 's/$old_string(^[0-9])+/$new_string/g' $FILENAME
Any idea?
-
edotan about 12 yearsTried to do as you explained but it doesnt work, here is the command i tried: sed -i -r "s/123.123.123.1[^0-9]+/4.4.4.4/g" test while the file named test contains: 123.123.123.100 123.123.123.1 The result was that nothing happened.
-
Ladadadada about 12 yearsAh, I see the problem. Updated answer.
-
edotan about 12 yearsOnce again you miss understood me :). As i said in my original post, ANYTHING can follow the matched string BUT a number. Anything includes nothing. For example if im looking to replace "aaa" with "xxx" so "aaaB" will turn to "xxxB" and "aaa<" will be replaced by "xxx<" BUT "aaa3" will stay "aaa3"