Visit The New, Modern Unix Linux Community


sed - How to insert line before the first blank line following a token


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting sed - How to insert line before the first blank line following a token
# 1  
sed - How to insert line before the first blank line following a token

Hello.

I have a config file (/etc/my_config_file) which may content :

Code:
#
# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
network_interface=eth0

# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#media_dir=V,/srv/media/film
#media_dir=A,/srv/media/musique
#media_dir=P,/srv/media/photo
#media_dir = /home/some_user/my_personal_old_data

# set this if you want to customize the name that shows up on your clients
friendly_name=SJL DLNA Server MY_SERVER OPENSUSE 13.1

I have a variable which contains the token to search :
Code:
MY_TOKEN="media_dir"

I have a variable which contains the file to search in
Code:
MY_FILE="/etc/my_config_file"

I have a variable which contains the value for the searched token
Code:
MY_PARAMETER_VALUE="media_dir = /srv/media/my_personal_new_data"

I want to insert $MY_PARAMETER_VALUE, before the blank line and after the line : #media_dir = /home/some_user/my_personal_old_data
and the search token is $MY_TOKEN using some function like :

Code:
my_insert  $MY_TOKEN  $MY_PARAMETER_VALUE $MY_FILE

Any help is welcome
# 2  
Code:
$ echo $MY_FILE
beforeblank.conf
$ echo $MY_TOKEN
media_dir
$ echo $MY_PARAMETER_VALUE
media_dir = /srv/media/my_personal_new_data

Code:
$ cat $MY_FILE
#
# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
network_interface=eth0

# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#media_dir=V,/srv/media/film
#media_dir=A,/srv/media/musique
#media_dir=P,/srv/media/photo
#media_dir = /home/some_user/my_personal_old_data

# set this if you want to customize the name that shows up on your clients
friendly_name=SJL DLNA Server MY_SERVER OPENSUSE 13.1

Code:
$ sed -e "/$MY_TOKEN/,/^[[:blank:]]*$/{" -e "\|^[[:blank:]]*$|s|.*|${MY_PARAMETER_VALUE}\n&|g" -e "}" $MY_FILE
#
# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
network_interface=eth0

# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#media_dir=V,/srv/media/film
#media_dir=A,/srv/media/musique
#media_dir=P,/srv/media/photo
#media_dir = /home/some_user/my_personal_old_data
media_dir = /srv/media/my_personal_new_data

# set this if you want to customize the name that shows up on your clients
friendly_name=SJL DLNA Server MY_SERVER OPENSUSE 13.1

Last line of file must a blank line.
To modified directly the file, you can use -i option if your sed support.
You just create a function that call this type de sed command.
Regards.
This User Gave Thanks to disedorgue For This Post:
# 3  
Awk approach

Code:
$ cat beforeblank.conf 
#
# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
network_interface=eth0

# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#media_dir=V,/srv/media/film
#media_dir=A,/srv/media/musique
#media_dir=P,/srv/media/photo
#media_dir = /home/some_user/my_personal_old_data

# set this if you want to customize the name that shows up on your clients
friendly_name=SJL DLNA Server MY_SERVER OPENSUSE 13.1

Code:
$ cat test.sh
#!/bin/bash

MYFILE="beforeblank.conf"
MY_TOKEN="media_dir"
MY_PARAMETER_VALUE="media_dir = /srv/media/my_personal_new_data"

echo $MY_FILE
echo $MY_TOKEN
echo $MY_PARAMETER_VALUE

awk -v token="$MY_TOKEN" \
    -v parva="$MY_PARAMETER_VALUE" '
     p ~ token && !NF{print parva;p="";x=1}!x{p=$0}1' $MYFILE

Code:
$ bash test.sh

media_dir
media_dir = /srv/media/my_personal_new_data
#
# port for HTTP (descriptions, SOAP, media transfer) traffic
port=8200

# network interfaces to serve, comma delimited
network_interface=eth0

# set this to the directory you want scanned.
# * if have multiple directories, you can have multiple media_dir= lines
# * if you want to restrict a media_dir to a specific content type, you
#   can prepend the type, followed by a comma, to the directory:
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)
#media_dir=V,/srv/media/film
#media_dir=A,/srv/media/musique
#media_dir=P,/srv/media/photo
#media_dir = /home/some_user/my_personal_old_data
media_dir = /srv/media/my_personal_new_data

# set this if you want to customize the name that shows up on your clients
friendly_name=SJL DLNA Server MY_SERVER OPENSUSE 13.1

This User Gave Thanks to Akshay Hegde For This Post:
# 4  
Quote:
Originally Posted by Akshay Hegde
Awk approach
Yes it works.
I prefer sed because I know a little about SED, but I know nothing about AWK
Just for my knowledge, How to edit inline ?

Thank you very much.

---------- Post updated at 13:08 ---------- Previous update was at 13:05 ----------

Quote:
Originally Posted by disedorgue
Last line of file must a blank line.
To modified directly the file, you can use -i option if your sed support.
You just create a function that call this type de sed command.
Regards.
Yes it works.
Thank you very much
# 5  
@ jcdole I didn't get you sorry, what do you want to edit ?
# 6  
[Solved] sed - How to insert line before the first blank line following a token

Quote:
Originally Posted by disedorgue
Last line of file must a blank line.
To modified directly the file, you can use -i option if your sed support.
You just create a function that call this type de sed command.
Regards.
Yes it works.
Thank you very much.
# 7  
Another option would be:
Code:
awk '$0~s,!NF{if(!NF)print v}1' s="$MY_TOKEN" v="$MY_PARAMETER_VALUE" file


Last edited by Scrutinizer; 12-29-2013 at 12:25 PM..

Previous Thread | Next Thread
Thread Tools Search this Thread
Search this Thread:
Advanced Search

Test Your Knowledge in Computers #994
Difficulty: Medium
A hypervisor or virtual machine monitor (VMM) is a computer software, firmware or hardware that creates and runs virtual machines.
True or False?

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed - Removing all characters from token to end of line

Hello. The token is any printable characters between 2 " . The token is unknown, but we know that it is between 2 " Tok 1 : "1234x567" Tok 2 : "A3b6+None" Tok 3 : "A3b6!1234=@" The ligne is : Line 1 : "9876xABCDE"Do you have any code fragments or data samples in your post Line 2 : ... (3 Replies)
Discussion started by: jcdole
3 Replies

2. Shell Programming and Scripting

Find regex, place on individual lines and insert blank line before

Hello, I have a file that I want to be able to insert a new line before every instance of a regex. I can get it to do this for each line that contains the regex, but not for each instance. Contents of infile: Test this 1... Test this 2... Test this 3... Test this 4... Test this... (2 Replies)
Discussion started by: deneuve01
2 Replies

3. Shell Programming and Scripting

sort with condition and insert blank line

Hi, I have a file with no blank line anywhere Its a conf file, The lines between and starts with "#" should be sort out with the first three characters(characters are between (a-z)). and insert a blank space in between the uniq lines. For clear understanding ,pls find the below input file... (11 Replies)
Discussion started by: anil8103
11 Replies

4. Shell Programming and Scripting

insert blank line between lines

Hello, I am trying to write a script that will count the number of characters for each line in a file and all the lines that have less than 80 characters and that are ending with a period, I want it to insert a blank line after them immediately. But, for whatever reason the condition if ]] is... (3 Replies)
Discussion started by: Pouchie1
3 Replies

5. Shell Programming and Scripting

Insert blank line if grep not found

Hi all, I've googling around forum regarding my prob, the nearest would same as thread tittled Insert blank line if grep not found, but she/he did not mention the solution, so I would like to request your help I've this task, to search in file2 based on pattern in file1 and output it to... (4 Replies)
Discussion started by: masterpiece
4 Replies

6. Shell Programming and Scripting

Insert blank line in a file

I have a file with data as below : Heading 1 ------------- Heading 1 data1 Heading 1 data2 Heading 1 data3 Heading 1 data4 Heading 2 ------------- Heading 2 data1 Heading 2 data2 Heading 2 data3 Heading 2 data4 Heading 3 ------------- Heading 3 data1 Heading 3 data2 Heading 3... (2 Replies)
Discussion started by: yoursdivu
2 Replies

7. Shell Programming and Scripting

compare three files and insert a blank line at each mismatch

i need to compare three files in unix a.txt b.txt c.txt 1 2 1 2 5 3 4 6 5 5 6 6 i need to insert a blank line in the file if i don't find a match and put the items at the same column if found a match The items in the files... (4 Replies)
Discussion started by: mad_man12
4 Replies

8. Shell Programming and Scripting

sed: delete regex line and next line if blank

Hi, I want to write a sed script which from batiato: batiato/giubbe: pip_b.2.txt pip_b.3.txt pip_b.3mmm.txt bennato: bennato/peterpan: 123.txt consoli: pip_a.12.txt daniele: (2 Replies)
Discussion started by: one71
2 Replies

9. Shell Programming and Scripting

insert text and add blank line

I need your help, I want to add a text every 2nd line and also a blank line after 3 line (In the output 2nd line is "changetype: modify" and every 4th line is blank line) Input file format dn: abc orclsourceobjectdn: abcd dn: bcd orclsourceobjectdn: bcda dn: cba orclsourceobjectdn:... (7 Replies)
Discussion started by: athidhi
7 Replies

10. Shell Programming and Scripting

Insert blank line if grep not found

Hello everyone... please help if you can -- I'm stumped. Making this work will save me hours of manual labor: I need to search file2 for pattern in file1. If pattern found append file2 line to file3. If pattern not found append a blank line to file3. file1 contents example: 123 456 789... (6 Replies)
Discussion started by: michieka
6 Replies

Featured Tech Videos