Sed/awk to delete a regex between range of lines


 
Thread Tools Search this Thread
Top Forums UNIX for Beginners Questions & Answers Sed/awk to delete a regex between range of lines
# 1  
Old 11-10-2019
Sed/awk to delete a regex between range of lines

Hi Guys

I am looking for a solution to one problem to remove parentheses in a range of lines.

Input file
Code:
module bist_logic_inst(a, ab , dhd, dhdh , djdj, hdh, djjd, jdj, dhd, dhp, dk
);
input a;
input ab;
input dhd;
input djdj;
input dhd;
output hdh;
output djjd;
output jdj;
output dk;
ps(),
ll(),
bist_reverse_mapper Umbist_reverse_inst(  .BIST_SO(), .BIST_SO_ts1(), .BIST_SO_ts2(), .BIST_SO_ts3(), .BIST_GO(), .BIST_GO_ts1(), 
      .BIST_GO_ts2(), .BIST_GO_ts3(), .clk_mbist(), .BIST_SETUP(), .ltest_to_mcp_bounding_en(), 
      .MEM0_BIST_COLLAR_SI(), .MEM1_BIST_COLLAR_SI(), .MEM2_BIST_COLLAR_SI(), .MEM3_BIST_COLLAR_SI(), 
      .bistEn(), .BIST_COLLAR_DIAG_EN(), .ltest_to_en(), .BIST_EVEN_GROUPWRITEENABLE(), 
      .BIST_ODD_GROUPWRITEENABLE(), .BIST_SELECT(), .BIST_WRITEENABLE()
  );

endmodule

I need to delete the () in the matching regexp : Umbist_reverse_inst and );

Output file

Code:
module bist_logic_inst(a, ab , dhd, dhdh , djdj, hdh, djjd, jdj, dhd, dhp, dk
);
input a;
input ab;
input dhd;
input djdj;
input dhd;
output hdh;
output djjd;
output jdj;
output dk;
ps(),
ll(),

bist_reverse_mapper Umbist_reverse_inst( .BIST_SO, .BIST_SO_ts1, .BIST_SO_ts2, .BIST_SO_ts3, .BIST_GO, .BIST_GO_ts1, 
      .BIST_GO_ts2, .BIST_GO_ts3, .clk_mbist, .BIST_SETUP, .ltest_to_mcp_bounding_en, .MEM0_BIST_COLLAR_SI, .MEM1_BIST_COLLAR_SI, .MEM2_BIST_COLLAR_SI, .MEM3_BIST_COLLAR_SI, .bistEn, .BIST_COLLAR_DIAG_EN, .ltest_to_en, .BIST_EVEN_GROUPWRITEENABLE, .BIST_ODD_GROUPWRITEENABLE, .BIST_SELECT, .BIST_WRITEENABLE 
  );

endmodule

I am trying below code but its not working
Code:
awk -v RS=" " '/Umbist_reverse_inst/{sub("()","")}1' list

# 2  
Old 11-10-2019
I suggest using a range expression, so that all replacements occur over all lines. Try:
Code:
awk '/Umbist_reverse_inst/,/\);/{gsub(/\(\)/,"")}1' list

Also, the parentheses need to be escaped, since they are special in the an (extended) regular expression.
Plus it is better to use a regex constant ( /.../ ) than a regex string ( " ... " ), otherwise the escape character ( \ ) needs to be escaped itself ( \\ )


--
In the example \); were used as the two characters indicating the last line of the range. If there can be spaces between them, you could use something like \)[ \t]*;

Last edited by Scrutinizer; 11-10-2019 at 07:20 AM..
This User Gave Thanks to Scrutinizer For This Post:
# 3  
Old 11-10-2019
A range must span over two (or more) lines.
With a status variable it may end on the same line:
Code:
awk '/Umbist_reverse_inst/ {r=1}; r {gsub(/\(\)/,"")}; /\);/ {r=0}; 1' list

If the start pattern is found then set the status variable r. If set then do the replacements. If the end pattern is found then clear the status variable.
This User Gave Thanks to MadeInGermany For This Post:
# 4  
Old 11-10-2019
Quote:
Originally Posted by MadeInGermany
A range must span over two (or more) lines.
With a status variable it may end on the same line:
[..]
That is the case with sed, but with awk it can be on the same line.

Code:
$ printf '1 2\n2 3\n3 4\n' | sed -n '/1/,/2/p' 
1 2
2 3

$ printf '1 2\n2 3\n3 4\n' | awk '/1/,/2/' 
1 2


Last edited by Scrutinizer; 11-10-2019 at 07:41 AM..
These 2 Users Gave Thanks to Scrutinizer For This Post:
# 5  
Old 11-10-2019
Hi
I have tried below code , this is also working

Code:
 sed -e '/Umbist_reverse_inst/,/);/ s/()//g' list

Thanks a lot for replying , I am looking for a TCL equivalent for this ,
Can anybody help me on this ?
# 6  
Old 11-11-2019
The sed definitely has the "range must span over two or more lines" problem.
Thanks Scrutinizer for showing that awk does not have this restriction.
Also perl does not have this restriction:
Code:
perl -pe '/Umbist_reverse_inst/,/\);/ and s/\(\)//g' list

This User Gave Thanks to MadeInGermany For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed or awk: delete n lines following a formfeed

Hi Members, This is my first post in this forum. I want to do is match form feed lines one by one in a file and delete the next n lines (ex-3 lines) with the form feed character Eg - Files looks like Data 1 Data 2 Data 3 FF Hdr1 Hdr2 Hdr3 Data4 Data5 FF Hdr1 Hdr2 Hdr3 (9 Replies)
Discussion started by: yohan
9 Replies

2. Shell Programming and Scripting

Delete lines falling in a range

Hi All, I have a file which contains lakhs of records 0136812368126 03000 Statement 1237129372189 02321 JIT 0136812368126 05000 terminal 1237129372189 05001 Utilise Is there an option to delete all lines which fall within the range 05000 to 05999? I tried... (6 Replies)
Discussion started by: swasid
6 Replies

3. Shell Programming and Scripting

To print lines between 2 timestamps using awk|sed and regex

Hi, I am using the following code to fetch lines that are generated in last 1 hr . Hence, I am using date function to calculate -last 1 hr & the current hr and then somehow use awk (or sed-if someone could guide me better) with some regex pattern. dt_1=`date +%h" "%d", "%Y\ %l -d "1 hour... (10 Replies)
Discussion started by: sarah-alikhan31
10 Replies

4. Shell Programming and Scripting

Delete Lines : after pattern1 and between pattern2 and pattern3 using awk/sed/perl

Hi I need to delete lines from a file which are after pattern1 and between pattern 2 and patter3, as below: aaaaaaaa bbbbbbbb pattern1 cdededed ddededed pattern2 fefefefe <-----Delete this line efefefef <-----Delete this line pattern3 adsffdsd huaserew Please can you suggest... (6 Replies)
Discussion started by: vk2012
6 Replies

5. Shell Programming and Scripting

sed or awk delete character in the lines before and after the matching line

Sample file: This is line one, this is another line, this is the PRIMARY INDEX line l ; This is another line The command should find the line with “PRIMARY INDEX” and remove the last character from the line preceding it (in this case , comma) and remove the first character from the line... (5 Replies)
Discussion started by: KC_Rules
5 Replies

6. Shell Programming and Scripting

Sed/awk to delete single lines that aren't touching other lines

Hello, I'm trying to figure out how to use sed or awk to delete single lines in a file. By single, I mean lines that are not touching any other lines (just one line with white space above and below). Example: one two three four five six seven eight I want it to look like: (6 Replies)
Discussion started by: slimjbe
6 Replies

7. Shell Programming and Scripting

sed/awk : how to delete lines based on IP pattern ?

Hi, I would like to delete lines in /etc/hosts on few workstations, basically I want to delete all the lines for a list of machines like this : for HOST in $(cat stations.lst |uniq) do # echo -n "$HOST" if ping -c 1 $HOST > /dev/null 2>&1 then HOSTNAME_val=`rsh $HOST "sed... (3 Replies)
Discussion started by: albator1932
3 Replies

8. Shell Programming and Scripting

sed delete range

Hi I would like to delete ranges of text from an html file; In the sentence; aqua>Stroomprobleem in Hengelo verholpen <a href="107-01.html"><font color=yellow>107</a> With several sentences like this in that file, where the text between <a href a> varies, so it needs to be deleted in the... (2 Replies)
Discussion started by: mdop
2 Replies

9. Shell Programming and Scripting

Using REGEX within SED range search

test data: Code: sed -n '/^**$*/,/;/{/;/G;p;}' What i'm trying to do with the above regex (in bleu) identify upper/lower case select only when select is at the beginning of the line OR preceded by a space select is followed by a space or is at the end of the line. ... (13 Replies)
Discussion started by: danmauer
13 Replies

10. Shell Programming and Scripting

regex to delete multiple blank lines in a file?

can't figure out a way to delete multiple empty lines but keep single empty lines in a file, file is like this #cat file 1 2 3 4 5 6 - What I want is 1 2 (6 Replies)
Discussion started by: fedora
6 Replies
Login or Register to Ask a Question