24sp ver.
Note: this is for the Spring 2024 iteration of CSE 391. Looking for a different quarter? Please visit https://courses.cs.washington.edu/courses/cse391/.
sed
(2 points)Due Tuesday 05/14 at 3:00 pm. No late submissions accepted.
Submission: Gradescope
Specification: Spec
This assignment focuses on using regular expressions and related command sed
. The set of files you will need will be on the latest main branch on the faang
repository in GitLab. One way of getting the latest main
is to run git pull
in the repository:
git checkout main
git pull
Another way is to re-clone the repository:
git clone git@gitlab.cs.washington.edu:cse391/24sp/faang.git
cd faang
You aren’t expected (and won’t be able) to push any changes to the repository. You will only be able to pull down files that you need. You should assume you are in the faang
directory when doing these problems.
Write your commands in on the indicated lines in the task1.sh
file. In response to each question, write the command that will perform the task described, not the output that the command produces. Please be sure to write the entire command (including the command name and the input file).
You should not commit/push changes to task1.sh
. Instead, submit the your file to Gradescope.
macOS users
Some of the necessary options to sed
for this assignment are not supported on the default macOS implementation of sed
. We recommend using attu
or the Linux VM.
Task 1: Bash Shell Commands with sed
¶
After updating the website, adding cutting-edge products to its inventory and pivoting into the biotech space, FAANG has decided to rebrand to 24andMe, in attempt to establish itself as a leader in the field and beat an unnamed competitor. The company has also decided that this is a great opportunity to address tech debt. As part of the rebrand and code clean up, you will use sed
to search and replace text in company files based on regular expressions.
Feel free to somewhat match your answers to the actual file you are given; your regexes do not have to work for a more general case. Write your commands in on the indicated lines in the task1.sh
file. For many of the files, you should be updating them in-place. We highly recommend providing a backup file extension to your sed command in these cases.
If you want to discard your changes to a file and “reset” them back to the original state run the command git checkout <file-you-want-to-reset>
. Be careful not to reset your task file!
Problem 1¶
You may have noticed that FAANG has yet to come up with a slogan. As part of the rebrand, the company wants to update its slogan. Write a command that replaces the string “Insert Catchy Slogan Here” in GenerateSite.java
with whatever slogan you want, updating the GenerateSite.java
file in-place.
Problem 2¶
Selling dirt was poor for the company image. Write a command that replaces all occurrences of “dirt” (case-insensitively) in Products.java
with the string “soil”. This command should update the file in-place.
Problem 3¶
The engineer who authored Product.java
and Employee.java
gave the classes public fields. Their teammates are not impressed. Fix this style mistake by writing the command that replaces all instances of public
with private
for the class fields only in Product.java
and Employee.java
, updating the file in-place.
Problem 4¶
Last week, the engineers discovered that the credit cards used on the site varied in formatting, causing a headache in validation. Some credit card numbers had spaces, some didn’t and the spacing wasn’t always consistent. Write the command that outputs the result of reformatting all of the credit cards from cards.txt
to have consistent spacing, where each group of 4 numbers is separated by a single space and the last group of numbers may be 1-4 characters. Your command should not modify cards.txt
.
Problem 5¶
Java programs can contain single-line //
comments and multi-line /* ... */
comments. Sometimes a programmer uses a multi-line comment syntax, but the comment only occupies a single line. Write a command that finds /* ... */
comments in Products.java
that occupy a single line and replaces them with a //
comment, in-place. For example, /* premium dirt */
would become // premium dirt
(note the space after //
).
Your command doesn’t need to modify comments where the /*
isn’t on the same line as the */
. You may assume that any given line contains at most one comment.
Problem 6¶
As part of the rebrand, all references to FAANG in the source code will need to be updated. Write a command that will find and replace all occurrences of FAANG, case-insensitively, found in all java files in the repository to 24AndMe. Your command should update all the files in-place.
Problem 7¶
Human Resources lost the list of employees at the company and realized the profiles on the staff webpage were too cryptic to use for payroll. The IRS doesn’t recognize “Kermit T Frog” as a valid wage-earning citizen. You’ll be reconstructing the list of employees by looking at all of the engineers who have contributed to the repository. Write a command that uses the output of git log
to find all of the unique contributors, case-insensitively, to the repository.
For this problem, a “contributor” should be all of the text that appears after “Author:
” in the git log
. Authors with the same name but different emails should be considered distinct. The output should be written to a file called contributors.txt
.
Problem 8¶
Using your contributors.txt
, output a list of the unique names of contributors. You should find the name by removing the email and surrounding angle brackets (<
and >
), and find unique names by removing duplicates case-insensitively.
Problem 9¶
Each of these contributors should also be given a company email. Use the usernames from the emails located between < >
in contributors.txt
to generate and output company emails of the form username@24AndMe.com
. You can assume the username of an email is any non-whitespace character that comes before the @
symbol. Be sure to only produce each unique email once.
Hints¶
- build your solutions iteratively - don’t write it all at once!
- we’ve done parts of these problems before in previous homeworks
- the regular expression syntax hints from the
grep
assignment apply here withsed
- some special characters must be escaped by a
\
to be used in a regex pattern - putting a
g
at the end of your pattern, such ass/oldpattern/newtext/g
, processes all matches on a line - struggling to debug a regex? Tools like regex101 may help!
For many of these problems, you may find it helpful to refer to the Regex Syntax on our reference page.