100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
Programming

Reading and Writing Files

The r, R, w, and W commands let sed pull the contents of external files into the output stream and write matched lines out to separate files during a single pass.

Editing CommandsIntermediate8 min readJul 10, 2026
Analogies

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.

bash
# 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.txt

w 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

Was this page helpful?

Topics covered

#Programming#SedStreamEditorStudyNotes#ReadingAndWritingFiles#Reading#Writing#Files#Beyond#StudyNotes#SkillVeris#ExamPrep