Text Processing
Sed Replace
Rewriting Stream Text
sed can rewrite matching text as it passes through a stream. Replacement text can come from a variable.
Program
Play the script to replace a status word with a selected output value.
sed_replace.sh
Replay: real traced execution (multi-file project)
#!/usr/bin/env bash
line="task:todo"
replacement="done"
updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"
echo "$updated"
#!/usr/bin/env bash
line="task:todo"
replacement="ready"
updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"
echo "$updated"
#!/usr/bin/env bash
line="task:todo"
replacement="blocked"
updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"
echo "$updated"
line ← task:todo
3line="task:todo"4replacement="done"values this steptask:todolinereplacement ← done
3line="task:todo"4replacement="done"5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"values this stepdonereplacementupdated ← task:done
4replacement="done"5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"6echo "$updated"values this steptask:doneupdateddonereplacementecho "$updated"
5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"6echo "$updated"outputtask:donevalues this steptask:doneupdated
line ← task:todo
3line="task:todo"4replacement="ready"values this steptask:todolinereplacement ← ready
3line="task:todo"4replacement="ready"5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"values this stepreadyreplacementupdated ← task:ready
4replacement="ready"5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"6echo "$updated"values this steptask:readyupdatedreadyreplacementecho "$updated"
5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"6echo "$updated"outputtask:readyvalues this steptask:readyupdated
line ← task:todo
3line="task:todo"4replacement="blocked"values this steptask:todolinereplacement ← blocked
3line="task:todo"4replacement="blocked"5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"values this stepblockedreplacementupdated ← task:blocked
4replacement="blocked"5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"6echo "$updated"values this steptask:blockedupdatedblockedreplacementecho "$updated"
5updated="$(printf '%s\n' "$line" | sed "s/todo/$replacement/")"6echo "$updated"outputtask:blockedvalues this steptask:blockedupdated
Follow the Replacement
linestarts astask:todo.replacementstarts asdone.sed "s/todo/$replacement/"replacestodowithdone.updatedbecomestask:done.- The script prints
task:done. | replacement | updated text | | --- | --- | | done | task:done | | ready | task:ready | | blocked | task:blocked |
sed substitute
`s/old/new/` replaces the first matching text on each input line.
double quotes
Double quotes around the sed script allow `$replacement` to expand.
stream rewrite
The original variable stays the same; the rewritten text is captured separately.
Exercise: sed_replace.sh
Reproduce task:done, then change replacement to the pinned variants ready and blocked and predict task:ready and task:blocked.