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

The TLDP Guide

Some Practical Examples

> 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 ReferencesThis 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.  

Blog Image
Figure 1.0: Solution passed all HackerRank tests cases

Testing in local environment

Blog Image
Figure 1.1: Notice the leading space

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

Blog Image
Figure 1.2: You can use sed to remove leading spaces with the specified regex.

Pipe our awk results to sed

#!/bin/bash

awk '{
    print $4,$3,$2,$1
}' | sed 's/^ *//g'
Blog Image
Figure 1.3: Got rid of the leading spaces
Blog Image
Figure 1.4: Solution passed all HackerRank tests cases

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 ¯\_(ツ)_/¯.

Blog Image
Figure 1.5: Solution works. Unfortunately, HackerRank doesn't accept it 🤷

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  ✌️.


If you like content like this, please consider buying me a coffee.

Thank you for your support :)


👇 Share this post 👇


💬 Comment Section 💬