0

From SED: insert text after the last line? - Unix & Linux Stack Exchange, I learnt that $ if used outside the substitution in sed represents the end of file. This I have tried to use in the follwing to replace all occurences of abc occuring after # Start and till end of the file by 123

Code:

file=Data.txt
Initial="# Start";
Final='\$'
orig="abc";
new="123"; 
sed -i -r -e "\!${Initial}!,\!${Final}!{s!${orig}!${new}!g}" ${file} ;

Data.txt

# Start

abc
abc

$

abc
abc

Output:

# Start

123
123

$

abc
abc

Expected Output:

# Start

123
123

$

123
123

What am I missing? i.e. How to tell to sed that $ means end of the file?


Note: I am escaping $, as I am using double quotes in the sed expression (for safer variable expansion). I hope this is correct. Can you comment on this?

  • You're telling sed to substitute in a range that starts with a line that matches # Start and ends with a line that matches $ and that's exactly what it does... – don_crissti Dec 11 '18 at 21:52
  • But how to tell that $ means end of the file? (as in the referred link). SED: insert text after the last line? - Unix & Linux Stack Exchange – Nikhil Dec 11 '18 at 21:53
  • "I learnt that $ if used outside the substitution in sed represents the end of file" ... Well, not quite, apparently... What's stopping you from using $ ? And btw, of all delimiters that could be used, ! is probably the worst choice... – don_crissti Dec 11 '18 at 22:00
  • @don_crissti Could you please give an example of how to use $ in above example to mean end of file? Also if possible, please give a suitable delimiter that you think is usually good in most of the cases. I used ! as it is rarely used symbol. – Nikhil Dec 11 '18 at 22:01
  • If you go back to the page you linked to you'll see at least two examples of proper usage of $ as an address. Ignore the accepted answer there which needlessly complicates things by double quoting and escaping the $. – don_crissti Dec 11 '18 at 22:04
0

This works: (Note: ${Final} instead of /${Final}/ )

file=Data.txt
Initial="# Start";
orig="abc";
new="123"; 
Final='$' # Line Number
sed -r -e "/${Initial}/,${Final}s/${orig}/${new}/g" ${file} 
  • -r not needed as no extended regular expression features are used. – Kusalananda Dec 13 '18 at 9:39

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.