Beyond the Standard Stream
sed is usually described as reading standard input and writing standard output, but it can also interact with named files mid-stream. The r command reads the entire contents of a file and queues them to be emitted after the current cycle completes; the w command writes the current pattern space to a named file. These enable powerful one-pass workflows such as splitting a log into per-category files, or injecting a template file wherever a placeholder line appears, all without a second tool or an intermediate script.
Cricket analogy: The r command is like a third umpire pulling up a stored replay clip and inserting it into the broadcast; sed keeps commentating the live match while an external file's contents are spliced into the feed.
r and R: Reading Files
The r filename command queues the entire contents of filename to be output after the current cycle, appearing after the pattern space in the output. If the file does not exist, r silently outputs nothing rather than erroring, which makes it forgiving but occasionally surprising. GNU sed adds the R filename command, which reads and emits just one line from filename each time it is invoked, advancing a private cursor in that file; successive R calls walk through the file line by line, and once exhausted R produces nothing. This makes R useful for interleaving two streams line by line.
Cricket analogy: r pours in a whole scorecard file at once; R is a ticker feeding one line of commentary per over, advancing through a prepared script delivery by delivery rather than dumping it all at once.
# Insert the contents of header.txt after every line matching '=== TITLE ==='
sed '/=== TITLE ===/r header.txt' page.txt
# Interleave: after each line of a.txt, emit one line of b.txt (GNU R)
sed 'R b.txt' a.txt
# Split a log: write ERROR lines to errors.log, keep normal output too
sed '/ERROR/w errors.log' app.log
# GNU W: write only the FIRST line of the pattern space to a file
sed -n '/^--$/,/^--$/{W block.txt\n}' multi.txtw and W: Writing Files
The w filename command writes the entire pattern space, followed by a newline, to filename each time the command runs; the file is truncated once when the script starts and then appended to for the rest of the run. GNU sed adds the W filename command, which writes only up to the first embedded newline of the pattern space, useful when the pattern space holds multiple joined lines. A single filename can be targeted by multiple w commands, and the special filenames /dev/stdout and /dev/stderr let you route lines to those streams rather than a disk file.
Cricket analogy: w is like a scorer filing every boundary into a dedicated 'fours and sixes' logbook that's cleared at the start of play and added to all innings; W files only the first line of a multi-line note.
The special targets /dev/stdout and /dev/stderr work with the w command (and the w flag of s///) in GNU sed, letting you echo selected lines to the terminal or error stream without a temporary file. This is handy for logging which lines matched while still producing normal output.
A w file is truncated exactly once, when sed first opens it at the start of the run, and appended to thereafter. If you run the same sed script twice, the second run overwrites the first run's file. Also, r on a nonexistent file fails silently — no error, no output — so check your filenames carefully.
- The r filename command queues an entire file's contents to be output after the cycle.
- r on a missing file silently outputs nothing rather than erroring.
- GNU R filename reads and emits one line per invocation, advancing a private cursor.
- The w filename command writes the pattern space (plus newline) to a file.
- A w file is truncated once at start and appended to for the rest of the run.
- GNU W filename writes only up to the first embedded newline of the pattern space.
- /dev/stdout and /dev/stderr can be used as w targets in GNU sed.
Practice what you learned
1. What does the r filename command do?
2. What happens when r is given a filename that does not exist?
3. How does the GNU R command differ from r?
4. When is the file named by a w command truncated?
5. What does the GNU W command write?
Was this page helpful?
You May Also Like
Append, Insert, and Change
The a, i, and c commands let sed add new lines after or before a matched line, or replace matched lines entirely, without relying on the substitute command.
Substitute Command Flags
The flags that follow the sed substitute command control how many matches are replaced, whether matching is case-insensitive, and what happens after the replacement.
The Hold and Pattern Space
sed maintains two buffers, the pattern space and the hold space, and a handful of commands move data between them to enable multi-line and stateful edits.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics