Hey there people on the internet. Here's my solution for Sed Command - 5 Linux shell challenge from HackerRank. You can find answers to other Linux shell challenges via this link => https://blog.shasec.rocks/post/hackerrank-bash-challs. So let's get started.
Challenge
Sed is a popular tool that enables quick parsing and transformation of text.
Here are some very simple examples of sed in action.
Substitute the first occurrence of 'editor' with 'tool'.
`$:~/hackerrank/bash/grep/grep1$` echo "My favorite programming editor is Emacs. Another editor I like is Vim." | sed -e s/editor/tool/
My favorite programming tool is Emacs. Another editor I like is Vim.
Substitute all the occurrences of 'editor' with 'tool':
`$:~/hackerrank/bash/grep/grep1$` echo "My favorite programming editor is Emacs. Another editor I like is Vim." | sed -e s/editor/tool/g
My favorite programming tool is Emacs. Another tool I like is Vim.
Substitute the second occurrence of 'editor' with 'tool':
`$:~/hackerrank/bash/grep/grep1$` echo "My favorite programming editor is Emacs. Another editor I like is Vim." | sed -e s/editor/tool/2
My favorite programming editor is Emacs. Another tool I like is Vim.
Highlight all the occurrences of 'editor' by wrapping them up in brace brackets:
`$:~/hackerrank/bash/grep/grep1$` echo "My favorite programming editor is Emacs. Another editor I like is Vim." | sed -e s/editor/{\&}/g
My favorite programming {editor} is Emacs. Another {editor} I like is Vim.
The following links are useful to learn about sed:
Sed - An Introduction and a tutorial
> Task
Given n lines of credit card numbers, mask the first 12 digits of each credit card number with an asterisk (i.e., *) and print the masked card number on a new line. Each credit card number consists of four space-separated groups of four digits. For example, the credit card number 1234 5678 9101 1234 would be masked and printed as **** **** **** 1234.
Useful References: This particular page on StackOverflow has a relevant example about sed, groups and backreferences. Here's a detailed tutorial covering groups and backreferences.
> Input Format
N credit card numbers, each in a new line, credit card numbers will have 4 space separated segments with 4 digits each.
> Constraints
1 <= n <= 20; However, the value of N does not matter while writing your command.
> Output Format
N lines, each containing a credit card number with the ordering of its segments reversed.
> Sample Input
1234 5678 9101 1234
2999 5178 9101 2234
9999 5628 9201 1232
8888 3678 9101 1232
> Sample Output
1234 9101 5678 1234
2234 9101 5178 2999
1232 9201 5628 9999
1232 9101 3678 8888
> Explanation
The order of the four segments in the (input) credit card numbers have been reversed.
Solution
I used awk command to do this challenge which is far easier than sed. At least for me :).
#!/bin/bash
awk '{
print $4,$3,$2,$1
}'
A single test case failed.

Testing in local environment

Get rid of these spaces and you pass the failed test case. Google. You might find some hints:

Pipe our awk results to sed
#!/bin/bash
awk '{
print $4,$3,$2,$1
}' | sed 's/^ *//g'


Optional
If you search for what you need you might find it. I just googled and found a StackOverflow question. Check out this answer.
#!/bin/bash
sed -e ':a;s/\([^_]*\) \([^ ]*\)/\2_\1/;ta;y/_/ /;'
Running the above script against our sample test input from HackerRank. It works as we get the expected output but doesn't work with HackerRank ¯\_(ツ)_/¯.

I honestly don't know what's going on in the above answer. If someone could explain me, I would appreciate it. Love to learn from you. Thanks ✌️.
💬 Comment Section 💬