sed to extract a multiline subject from a mail message


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting sed to extract a multiline subject from a mail message
# 1  
Old 02-05-2013
sed to extract a multiline subject from a mail message

I'm trying to extract a subject from a mail message but my subject example has 2 lines. How can I manage to extract it and write a string at the end of it?

Consider this example:

Code:
From: test@domain.com
Subject: Re: U =?ISO-8859-1?Q?qu=EA=3F!=3F!=3F!!_wtff_=E7=E3o_=ED=F3?=
 =?ISO-8859-1?Q?=FA=E1=E7?=
Date: 23/05/2012

Tried this:
Code:
sed 'N;s/^Subject:.*/Subject: \1 string/;P;D;'

And i get the ' invalid reference \1 on `s' command's RHS' error.

Last edited by Scrutinizer; 02-05-2013 at 02:40 PM.. Reason: code tags
# 2  
Old 02-05-2013
What output are you looking for?
# 3  
Old 02-05-2013
What I want is to insert a string at the end of the subject. Like this:

Code:
From: test@domain.com 
Subject: Re: U =?ISO-8859-1?Q?qu=EA=3F!=3F!=3F!!_wtff_=E7=E3o_=ED=F3?=
 =?ISO-8859-1?Q?=FA=E1=E7?=  ***STRING*** 
Date: 23/05/2012

Tried this and it worked:
Code:
sed 'N;s/^Subject:\(.*\)/Subject:\1STRING/;P;D;' file.txt

But.... now I have another problem. When the subject has only 1 line, like this:

Code:
From: test@domain.com
Subject: Re: U =?ISO-8859-1?Q?qu=EA=3F!=3F!=3F!!_wtff_=E7=E3o_=ED=F3?= 
Date: 23/05/2012

The String gets written in the end of the 'Date:' line

How can I get both regex working (with 1 and 2 lines) on the same sed command?
# 4  
Old 02-05-2013
Quote:
Originally Posted by twisterbr
Tried this:
Code:
sed 'N;s/^Subject:.*/Subject: \1 string/;P;D;'

And i get the ' invalid reference \1 on `s' command's RHS' error.
There's no \(...\) expression for the \1 backreference to refer to.

Appending a string to the pattern space does not require backreferences:
Instead of s/\(.*\)/\1 string/, use s/.*/& string/

If you want to append something to the line following the line that begins with "Subject:":
Code:
/^Subject:/{n; s/.*/& addendum/;}

Regards,
Alister

---------- Post updated at 02:37 PM ---------- Previous update was at 02:00 PM ----------

Quote:
Originally Posted by twisterbr
But.... now I have another problem. When the subject has only 1 line, like this:

Code:
From: test@domain.com
Subject: Re: U =?ISO-8859-1?Q?qu=EA=3F!=3F!=3F!!_wtff_=E7=E3o_=ED=F3?= 
Date: 23/05/2012

The String gets written in the end of the 'Date:' line

How can I get both regex working (with 1 and 2 lines) on the same sed command?
Test whether the pattern space contains \nDate: then insert the string appropriately (either before the newline if there's a match or at the end of the pattern space if there isn't).

Regards,
Alister
# 5  
Old 02-05-2013
Quote:
Originally Posted by alister
There's no \(...\) expression for the \1 backreference to refer to.

Appending a string to the pattern space does not require backreferences:
Instead of s/\(.*\)/\1 string/, use s/.*/& string/

If you want to append something to the line following the line that begins with "Subject:":
Code:
/^Subject:/{n; s/.*/& addendum/;}

Regards,
Alister

---------- Post updated at 02:37 PM ---------- Previous update was at 02:00 PM ----------


Test whether the pattern space contains \nDate: then insert the string appropriately (either before the newline if there's a match or at the end of the pattern space if there isn't).

Regards,
Alister
Hello Alister, thanks for your help!! but I was thinking in a more flexible way on doing that. I mean, what if the next line is not 'Date:'?

I want to do like this: "If the next line after '^Subject:' starts with a blank space, write the following string at the end of it.. if not, write at the end of the "^Subject:" line."
# 6  
Old 02-05-2013
Code:
sed -e '/^Subject:/N; s/\n .*/& addendum/' -e t -e 's/\n/ addendum&/'

\n is only present after the N command.
The t command branches to the end of the script if the previous s command was successful, so the second s command is skipped.
# 7  
Old 02-05-2013
Quote:
Originally Posted by MadeInGermany
Code:
sed -e '/^Subject:/N; s/\n .*/& addendum/' -e t -e 's/\n/ addendum&/'

\n is only present after the N command.
The t command branches to the end of the script if the previous s command was successful, so the second s command is skipped.
that worked!! Thanks MadeInGermany!!!
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Need grep regex to extract multiline text between two strings

I have a file conatining the below: --- 10.9.16.116: /tmp/5835113081224811756.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb /tmp/4603745991442278706.jar: hash: e6df90d38fa86f0e289f73d79cd2cfd2a29954eb 10.9.14.126: /tmp/conf/extra/httpd-ssl.conf: hash:... (1 Reply)
Discussion started by: mohtashims
1 Replies

2. Shell Programming and Scripting

sed multiline problem

I'm trying to replicate the sed output on p.108 of Sed&Awk,by Doughery & Robbins, 2nd edition. I'm on a Windows 10 Surface Pro, running Cygwin for 64-bit versions of Windows. Input text saved in text file called data_p108.txt: Consult Section 3.1 in the Owner and Operator Guide for a... (9 Replies)
Discussion started by: prooney
9 Replies

3. Shell Programming and Scripting

[sed]: Substitute a string with a multiline value

Dear all, I try to replace a string of characters in a file (MyFile.txt) by a multiline value of the variable "Myvar": $ cat MyFile.txt DESCRIPTION '@TargetTable SCHEMA' ( @InputFlowDef ); $ The content of Myvar: $ echo "$Myvar" col1 , col2 , col3 $ (4 Replies)
Discussion started by: dae
4 Replies

4. Shell Programming and Scripting

Multiline sed

Hi guys, I am fairly comfortable with using the sed command if the string to be replaced is all on a single line. I was wondering is it possible to use sed command in a multiline way ? Say for example I have the below string on 2 different lines: { "key": "brandNameA", ... (3 Replies)
Discussion started by: Junaid Subhani
3 Replies

5. UNIX for Dummies Questions & Answers

Need Multiline sed help!!

Hey everyone, I'm new to sed and I need to create a script for inserting one line of code at the beginning of every method in a Xcode project (over 6,000 methods). Each method Structure is (+ or -) (Various declarations-- could span multiple lines) ({) I've tried for days, any guidance would be... (2 Replies)
Discussion started by: jimmyz
2 Replies

6. UNIX for Dummies Questions & Answers

sed multiline pattern match

How can I write a script that takes a cisco config file and outputs every occurrence of two, or more, pattern matches through the whole config file? For example, out of a config file, i want to print out every line with interface, description and ip address through the whole file, and disregard... (3 Replies)
Discussion started by: knownasthatguy
3 Replies

7. Shell Programming and Scripting

sed multiline substitution if a condition holds

Hi. I have the following text file (more precisely a Matlab script): dummy1 = 5; varx = 'false'; dummy2 = 6; % ... some general commands % ... dummy3 = 7; vary = 'option1'; dummy4 = 8; Using sed I want to do the following action: IF varx = 'false' vary='NEW_VALUE_1'... (11 Replies)
Discussion started by: plsrn
11 Replies

8. Shell Programming and Scripting

Multiline pattern search using sed or awk

Hi friends, Could you please help me to resolve the below issue. Input file :- <Node> <username>abc</username> <password>ABC</password> <Node> <Node> <username>xyz</username> <password>XYZ</password> <Node> <Node> <username>mnp</username> ... (3 Replies)
Discussion started by: haiksuresh
3 Replies

9. Shell Programming and Scripting

delete multiline string from file using sed.

Hi, I have file which has the following content... GOOD MORNING **********WARNING********** when it kicks from the kickstart, sshd daemon should start at last. (WHEN KICKING ITSELF, NOT AFTER KICKING). /etc/rc3.d/S55sshd ( run level specification for sshd is 55, now I would want to... (4 Replies)
Discussion started by: skmdu
4 Replies
Login or Register to Ask a Question