insert text with sed on the same line that pattern search - sed

For example if I have this file :
The green horse is blue localhost
my pants is dirty localhost
your eyes is so beautiful localhost
The best area is localhost
And I want to add text (192.168.25.50) in this file after each 'localhost' pattern search.
I don't want to create a new line
I don't want to insert on each end of line but just after a pattern
I don't want to use awk, I need to know if sed command can do this
Indeed my result must look like that :
The green horse is blue localhost 192.168.25.50
my pants is dirty localhost 192.168.25.50
your eyes is so beautiful localhost 192.168.25.50
The best area is localhost 192.168.25.50
Lot of sed issue exist but all have a specific context which can't help my simple and basics issue. I already can insert text after a pattern in a same file but never in a same line.
Can you explain me how to insert with sed command in a same line that the pattern used by sed command itself ?

With GNU sed:
sed 's/\blocalhost\b/& 192.168.25.50/' file
\b: a zero-width word boundary
&: refer to that portion of the pattern space which matched
If you want to edit your file "in place" use sed's option -i.

Related

sed command to replace a word after another one

Let's say i have a file where the word "default" is repeated more times. I want to replace it with "custom" but just where it follows the word "background", regardless of the line number. How could I achieve this with the sed command?
I have been able to do it with
sed - i '/set background default/c\set background custom /` file.conf but it's not really worth changing a whole line for just replacing a single word.
Like this, using capture group:
sed -i -E 's/(set background) default/\1 custom/' file.conf
# ^--------------^ ^-^
# captured restaured

sed command for text selection with starting and stopping phrase

I know the typical sed editing statements, such as
sed "s/substitutethis/withthis/g" file
However, when I searched for how to extract lines between two phrases, I found this:
sed -n "/startphrase/,/stopphrase/p" file
Could someone explain, please? The man page does not help me.
I know that -n suppresses echoing of output. Why do they use -n and p? Leaving out both does not work. What does the comma stand for?
This:
"/startphrase/,/stopphrase/p"
means "from the line containing startphrase to the line containing stopphrase, print".
There are many sed tutorials that talk about "range of lines".

Insert specific lines from file before first occurrence of pattern using Sed

I want to insert a range of lines from a file, say something like 210,221r before the first occurrence of a pattern in a bunch of other files.
As I am clearly not a GNU sed expert, I cannot figure how to do this.
I tried
sed '0,/pattern/{210,221r file
}' bunch_of_files
But apparently file is read from line 210 to EOF.
Try this:
sed -r 's/(FIND_ME)/PUT_BEFORE\1/' test.text
-r enables extendend regular expressions
the string you are looking for ("FIND_ME") is inside parentheses, which creates a capture group
\1 puts the captured text into the replacement.
About your second question: You can read the replacement from a file like this*:
sed -r 's/(FIND_ME)/`cat REPLACEMENT.TXT`\1/' test.text
If replace special characters inside REPLACEMENT.TXT beforehand with sed you are golden.
*= this depends on your terminal emulator. It works in bash.
In https://stackoverflow.com/a/11246712/4328188 CodeGnome gave some "sed black magic" :
In order to insert text before a pattern, you need to swap the pattern space into the hold space before reading in the file. For example:
sed '/pattern/ {
h
r file
g
N
}' in
However, to read specific lines from file, one may have to use a two-calls solution similar to dummy's answer. I'd enjoy knowing of a one-call solution if it is possible though.

Using sed to comment out lines that contain a specific string of text

Please bear with me as I'm new to the forums and tried to do my research before posting this. What I'm trying to do is to use sed to look through multiple lines of a file and any line that contains the words 'CPU Usage" I want it to comment out that line and also 19 lines immediately after that.
Example file.txt
This is some random text CPU USAGE more random text
Line2
Line3
Line4
Line5
etc.
I want sed to find the string of text CPU usage and comment out the line and the 19 lines following
#This is some random text CPU USAGE more random text
#Line2
#Line3
#Line4
#Line5
#etc.
This is what I've been trying but obviously it is not working since I'm posting on here asking for help
sed '/\/(CPU Usage)s/^/#/+18 > File_name
sed: -e expression #1, char 17: unknown command: `^'
I'd like to be able to use this on multiple files. Any help you can provide is much appreciated!
GNU sed has a non-standard extension (okay, it has many non-standard extensions, but there's one that's relevant here) of permitting /pattern/,+N to mean from the line matching pattern to that line plus N.
I'm not quite sure what you expected your sed command to do with the \/ part of the pattern, and you're missing a single quote in what you show, but this does the trick:
sed '/CPU Usage/,+19 s/^/#/'
If you want to overwrite the original files, add -i .bak (or just -i if you don't mind losing your originals).
If you don't have GNU sed, now might be a good time to install it.
This can easily be done with awk
awk '/CPU Usage/ {f=20} f && f-- {$0="#"$0}1' file
When CPU Usage is found, set flag f=20
If flag f is true, decrements until 0 and for every time, add # in front of the line and print it.
Think this should work, cant test it, if anyone finds something wrong just let me know :)
awk '/CPU Usage/{t=1}t{x++;$0="#"$0}x==19{t=0;x=0}1' file

Limiting the sed search to 2 nd column in a file

Below is the content of ma file (sample.txt):
CQUAD4 5600000 560005 5602371 5602367 5602374 5602372 0. -1.75
CQUAD4 5600003 560005 5600000 5602367 5602374 5602372 0. -1.75
Am using the below command:
sed -i "s#\(\s*\w*\s*\)\(5600000\)\(\s*\)\([0-9]*\)\(.*\)#\1\2\36000 \5#g" sample.txt
I want to restrict the pattern matching 5600000 to only second column and then do a replace with '6000 '.
Can somebody help me...please
Here's a possible solution with GNU sed. Anchor the search to start of line with ^.
sed -i -r "s#^(\s*\S+\s+)5600000\s+#\16000 #" sample.txt
awk might be a little more natural for this:
awk '$2=="5600000"{$2="6000";print} 1' sample.txt
That basically says "if the second field is 5600000, replace it with 6000 and print the line, otherwise just print the line".
The one downside I see is that this might, depending on your version of awk, collapse multiple spaces down to one, which may mess with the alignment of your columns. You'll have to decide if that's a problem or not...