i have a file like below
cat test -(X- different words )
XXXXXXXXXXXXXXXXXXX
always-a-constant:::pete
XXXXXXXXXXXXXXXXX
i need to add steve next to pete and generate a new file and the output should look like the below.
XXXXXXXXXXXXXXXXXXX
always-a-constant:::pete,steve
XXXXXXXXXXXXXXXXX
I can use awk
cat test | grep -i alw| awk '{print $0",steve"}'
always-a-constant:::pete,steve
but i still need the other lines XXX .
With this as our test file:
$ cat test
XXXXXXXXXXXXXXXXXXX
always-a-constant:::pete
XXXXXXXXXXXXXXXXX
We can add ,steve
after any line that starts with alw
with:
$ sed '/^alw/ s/$/,steve/' test
XXXXXXXXXXXXXXXXXXX
always-a-constant:::pete,steve
XXXXXXXXXXXXXXXXX
In sed's regular expressions, $
matches at the end of a line. Thus, s/$/,steve/
adds ,steve
on at the end of the line.
$ awk '/^alw/ {$0=$0",steve"} 1' test
XXXXXXXXXXXXXXXXXXX
always-a-constant:::pete,steve
XXXXXXXXXXXXXXXXX
In awk, $0
represents the current line. $0",steve"
represents the current line followed by the string .steve
. Thus, $0=$0",steve"
replaces the current line with the current line followed by ,steve
.
The final 1
in the awk command is important: it is awk's shorthand for print-the-line. Any non-zero number would work. In more detail, awk treats the 1
as a condition (a boolean). Because it evaluates to true (nonzero), the action is performed. Since we didn't actually specify an action, awk performs the default action which is to print the line. Hence, 1 is shorthand for print-the-line.
Alternatively, we can add ,steve
after any line that ends with :::pete
with:
$ sed 's/:::pete/&,steve/' test
XXXXXXXXXXXXXXXXXXX
always-a-constant:::pete,steve
XXXXXXXXXXXXXXXXX