Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Empty regular expression in sed script

Tags:

shell

unix

ksh

sed

Found the following sed script to reverse characters in each line, from the famous "sed one liners", and I am not able to follow the following command in //D of the script

sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

Suppose the inital file had two lines to start with say,

apple
banana

After the first command,

/\n/!G

pattern space would be,

apple

banana

[a new line introduced after each line. Code tag removing the last new line here. So it is not shown]. After the second command,

s/\(.\)\(.*\n\)/&\2\1/

pattern space would be,

apple
pple
a
banana
anana
b

How does the third command work after this? Also, I understand empty regular expression(//) matches the previously matched regexp. But in this case, what that will be? \n from the 1st command or the regexp substituted by the 2nd command? Any help would be much appreciated. Thanks.

like image 369
toddlermenot Avatar asked Dec 21 '25 02:12

toddlermenot


1 Answers

Using the suggestion from my own comment above this is what happens:

After /\n/!G pattern space would be

apple¶
banana¶

After s/\(.\)\(.*\n\)/&\2\1/ pattern space would be

apple¶pple¶a
banana¶anana¶b

then comes the D command. from man sed:

   D      Delete  up  to  the first embedded newline in the pattern space.
          Start next cycle, but skip reading from the input  if  there  is
          still data in the pattern space.

so the first word and the first is deleted. then sed starts from the 1st command but since the pattern space contains a the pattern /\n/ does not match and the G command is not executed. The 2nd command leads to

pple¶ple¶pa
anana¶nana¶ab

can you continue from there?

like image 59
user829755 Avatar answered Dec 24 '25 01:12

user829755



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!