Sed Inside an Awk Statement
I'd Like to Perform a Series of Sed Commands on Lines of a File Roster. Txt Only Beginning with a Keyword. for Example: Employee: Kiara 20 Hours@8.25 Employee...
I'd like to perform a series of sed commands on lines of a file roster.txt only beginning with a keyword. For example:
Employee : Kiara 20 hours@8.25
Employee : Connor 25 hours@8.00
Employee : Dylan 30 hours@9.00
Becomes:
Employee : Kiara_20_hoursat8dot25
Employee : Connor_25_hoursat8dot00
Employee : Dylan_30_hoursat9dot00
I know the sed commands to make the changes I just wanted a way to peform them on lines starting with "employee". Maybe
awk '$1 == "Employee" {sed -i -e 's/\./dot/g' roster.txt}' roster.txt
3 Answers
$ cat roster.txt
foo : bar@baz.123
Employee : Kiara 20 hours@8.25
Employee : Connor 25 hours@8.00
Employee : Dylan 30 hours@9.00
$ awk 'BEGIN{FS=OFS=" : "} $1=="Employee"{gsub(/ /,"_",$2); gsub(/@/,"at",$2); gsub(/\./,"dot",$2)} 1' roster.txt
foo : bar@baz.123
Employee : Kiara_20_hoursat8dot25
Employee : Connor_25_hoursat8dot00
Employee : Dylan_30_hoursat9dot00
awk supports substitution commands as well - sub to replace first occurrence and gsub to replace all occurrences. Also allows to change only specific field
BEGIN{FS=OFS=" : "}use:as input/output field separatorgsub(/ /,"_",$2)replace all spaces with_only for second field- Similarly other substitutions as required
1at end of command is idiomatic way to print the line, includes any changes made- See also awk save modifications in place
I'd write:
sed '/^Employee :/ {s/@/at/; s/\./dot/; s/ /_/3g}' <<END
Employee : Kiara 20 hours@8.25
Employee : Connor 25 hours@8.00
Employee : Dylan 30 hours@9.00
Foo : bar
END
Employee : Kiara_20_hoursat8dot25
Employee : Connor_25_hoursat8dot00
Employee : Dylan_30_hoursat9dot00
Foo : bar
Requires GNU sed for the 3g modifier of the s command
You really do not need to use both tools, either will do everything you need.
sed solution:
sed -i -e 's/^Employee : \([^ ]*\) \([0-9]*\) hours@\([0-9]\)\.\([0-9]*\)/Employee : \1_\2_hoursat\3dot\4/' roster.txt
Edit after comment:
If you want a very generic replacement using only sed that works on your sample:
sed -i -e 's/\([^:]\) \([^:]\)/\1_\2/g' -e 's/@/at/g' -e 's/\./dot/g' roster.txt