FAQ: Redirection - sed

This community-built FAQ covers the “sed” exercise from the lesson “Redirection”.

Paths and Courses
This exercise can be found in the following Codecademy content:

Web Development

Learn the Command Line

FAQs on the exercise sed

There are currently no frequently asked questions associated with this exercise – that’s where you come in! You can contribute to this section by offering your own questions, answers, or clarifications on this exercise. Ask or answer a question by clicking reply (reply) below.

If you’ve had an “aha” moment about the concepts, formatting, syntax, or anything else with this exercise, consider sharing those insights! Teaching others and answering their questions is one of the best ways to learn and stay sharp.

Join the Discussion. Help a fellow learner on their journey.

Ask or answer a question about this exercise by clicking reply (reply) below!
You can also find further discussion and get answers to your questions over in #get-help.

Agree with a comment or answer? Like (like) to up-vote the contribution!

Need broader help or resources? Head to #get-help and #community:tips-and-resources. If you are wanting feedback or inspiration for a project, check out #project.

Looking for motivation to keep learning? Join our wider discussions in #community

Learn more about how to use this guide.

Found a bug? Report it online, or post in #community:Codecademy-Bug-Reporting

Have a question about your account or billing? Reach out to our customer support team!

None of the above? Find out where to ask other questions here!

When I followed the steps to substitute “snow” for “rain” in this exercise, it printed the changes to the terminal each time, but did not actually change the document forests.txt. So when I did the final step and used “cat forests.txt”, none of the instances of “snow” had been replaced with “rain”.

How do I make the substitutions permanent in forests.txt?

4 Likes

Welcome back to the forums!

You can use the -i option to edit a file permanently.

See here for more information.

3 Likes

Thank you! That is helpful.

1 Like

is it necessary to enclose expressions in apostrophe ‘’ ?

because in lesson expressions work fine without them

Quotes are very important in certain bash expressions; the following seems to cover some info (or have a web search for the same terms if you prefer a different guide):
https://wiki.bash-hackers.org/syntax/quoting

1 Like

Hi! Although I try to replace the first ‘snow’ only with sed ‘s/snow/rain/’ forests.txt, it replaces the part of the text:
sed ‘s/snow/rain/’ forests.txt

Could you please explain the reason?

I’m not certian what you mean, sed works linewise and you requested that snow be replaced with rain which seems to be what occurred. The fnal /g flag would replace all instances of the substring within a given line such that the final line would be Pacific Temperature: rainforest rainforest from the original Pacific Temperature: snowforest snowforest

1 Like

Ah, I got it wrong first. I thought only the first snow should be replaced in the first line The Amazon rainforest. I got it now, thank you!

1 Like

Hey! hoping for some help with this substitution. I think the command is correct but for some reason I keep getting this error message (third line)

The substitution isn’t happening in my terminal

This has to do with new versions of mac I think.

I’ll give you an example of how you might do it:

Filename: text.txt

hello world!

command in directory

sed -i'' -e 's/hello morld/hello morld!/g' ./text.txt

Now we look at the file and it is:

hello morld!

note the lack of space after the -i and ''. And furthermore note the addition of the -e after the -i‘’. As you will see below, the -e serves to signify that the following text is a command.

Note if you read the man pages (man sed) you have some clue as to why this is

sed [-Ealn] [-e command] [-f command_file] [-i extension] [file …]

meaning that using sed with the -i flag requires an extension (plus the file)

looking further at the -i flag entry:

 -i extension
         Edit files in-place, saving backups with the specified
         extension.  If a zero-length extension is given, no backup
         will be saved.  It is not recommended to give a zero-length
         extension when in-place editing files, as you risk corruption
         or partial content in situations where disk space is
         exhausted, etc.

So essentially using the empty '' backup is a bit of a hack and should be avoided in practice.

Please note -e is not the same as extension (it’s for command). Maybe not the most intuitive thing, but this is what we have.

I’ll give an example using the extension explicitly:

sed -i'.backup' -e 's/hello morld/hello dorld/g' ./text.txt

Now if we list the directory we have 2 files!

text.txt //contains new file text "hello morld!"
text.txt.backup //contains the old file text "hello world!"
3 Likes

wow it works! So essentially (forgive/correct me if I am using improper lingo) the sed command has been updated with an extra parameter, thus, when calling it, it now requires 2 arguments instead of just one (one for the unmodified file’s location and the next for the modified file). Both of these arguments need to be preceded by some option.

Not a problem, happy to help!

It might be easier to think of sed as a program,(specifically, a command-line non-interactive text editor).

I think you can install different versions and the commands will vary slightly from version to version (which is why I suggested the man pages. Although sometimes hard to read, their usefulness is powerful for all things Linux).

1 Like