Sponsored Content
Top Forums UNIX for Dummies Questions & Answers Perl find & replace - what am I doing wrong? Post 302814989 by bakunin on Thursday 30th of May 2013 06:34:54 PM
Old 05-30-2013
balajesuri has already answered most of your questions, so i will try to shed some additional light on it:

Quote:
Originally Posted by sudon't
And part of the reason is that it "works in place" rather than creating new files.
As i have explained in detail in the mentioned thread: it just looks that way.

Quote:
Originally Posted by sudon't
Also, I like the notion of a perl pie!
LOL!

Quote:
Originally Posted by sudon't
How is the line being deleted? Is that what the d operator is saying, delete? And will it then delete any line which contains the preceding string? In other words, if we know that only our target line contains "PhotoBooth", would that be enough to get rid of the whole line?
Code:
'/PhotoBooth/d'

Yes, more or less.

Whenever you construct a regexp you have to ask three questions:

1) does it match what i want to match?
As you want to delete lines containing "PhotoBooth", this is obviously the case. OK.

2) does it match any instance i want to match?
For instance, there might be lines which do not read "PhotoBooth", but "Photobooth" and which should also be deleted. The regexp above won't catch these, because regexps are case-sensitive. You would have to use another - slightly different - regexp to catch both versions.

3) does it match things i don't want to match?
For instance, you might have lines in your files which contain "PhotoBooth", but which shouldn't be deleted. In this case you would have to enlarge your regexp, maybe to match only instances of "PhotoBooth" inside "<string>"-tags.

Note, i do not know your files, so i don't know if these points apply to your project. What i said is just a how-to for constructing regexps in general.

Regarding the "d" command for deleting lines: the general form of a command in "sed" is one of the three versions:

Code:
address,address command
address command
command

"address" can be a regexp, a line number or the symbol "$", which means the last line.
"command" can be either a single command, like "s" (=substitute, change), "d" (=delete), etc. or a compound command, consisting of several singular commands: "{ cmd1; cmd2; cmd3; ...}"

The first form applies "command" to consecutive lines, starting with the first address and ending with the last:

Code:
10,15d
/foo/,/bar/ s/x/y/

The first will delete lines 10-15, the second will change "x" to "y" in a block of lines from a line containing "foo" to a line containing "bar".

The second form will apply the command to a certain line or all the lines for which the regexp matches. Your command is this pattern:

Code:
10d
/foo/ s/x/y/

The first example will delete line 10, the second will change "x" to "y" only in lines containing "foo".

The third variation, finally, will apply "command" to every line. This is what most times is used.

Code:
d
s/x/y/

The first would delete every line (not very helpful, LOL), the second would replace "x" by "y" in every line.

Quote:
Originally Posted by sudon't
Why do certain characters have to be escaped? I thought if the regex is quoted, it's protected from the shell.
You do not have to protect it from the shell, but from the regexp-engine. Like the shell, regexp engines have characters too which have a special meaning to them, as bajalesuri has already explained. These characters are called "metacharacters" and all have this property: they do not stand for themselves (their "literal" meaning), but have some special function. Every time you want to use them literally, you have to escape them to tell the regexp engine it shouldn't treat them in their special capacity but as normal characters. You might want to read this little introduction about regular expressions.

I hope this helps.

bakunin
 

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Find & Replace

I get a text file with 70+ columns (seperated by Tab) and about 10000 rows. The 58th Column is all numbers. But sometimes 58th columns has "/xxx=##" after the numeric data. I want to truncate this string using the script. Any Ideas...:confused: (3 Replies)
Discussion started by: gagansharma
3 Replies

2. UNIX for Dummies Questions & Answers

improving my script (find & replace)

Hi all, I have a script that scan files, find old templet and replace it with new one. #!/bin/ksh file_name=$1 old_templet=$2 new_templet=$3 # Loop through every file like this for file in file_name do cat $file | sed "s/old_templet/new_templet/g" > $file.new #do a global searce and... (8 Replies)
Discussion started by: amir_yosha
8 Replies

3. Shell Programming and Scripting

find & incremental replace?

Looking for a way using sed/awk/perl to replace port numbers in a file with an incrementing number. The original file looks like... Host cmg-iqdrw3p4 LocalForward *:9043 localhost:9043 Host cmg-iqdro3p3a LocalForward *:10000 localhost:10000 Host cmg-iqdro3p3b LocalForward... (2 Replies)
Discussion started by: treadwm
2 Replies

4. UNIX for Dummies Questions & Answers

Find, Replace & Edit a string?

Is this something SED would be used for or can AWK do it? I have a string that I would like to chop bits out of and re-arrange some of the rest. Basically I want to change this: <log4j:event logger="webserver" timestamp="1240110840109" time="Sun Apr 19 04:14:00 BST 2009" level="INFO"... (4 Replies)
Discussion started by: Sepia
4 Replies

5. Shell Programming and Scripting

find & replace with user input

Trying to create a script/executable to replace "abc" text string in "myfile.htm" with input from a pop-up field. For example, launch this thing and a prompt is popped up asking the user to input what "abc" should be replaced with, then it inserts what the user inputs in place of abc in the... (3 Replies)
Discussion started by: mike909
3 Replies

6. Shell Programming and Scripting

Find & Replace string in multiple files & folders using perl

find . -type f -name "*.sql" -print|xargs perl -i -pe 's/pattern/replaced/g' this is simple logic to find and replace in multiple files & folders Hope this helps. Thanks Zaheer (0 Replies)
Discussion started by: Zaheer.mic
0 Replies

7. Shell Programming and Scripting

Find & replace --> create a new file

Hi All, I have a unix shell script file as below. My task is a)to replace 248 to 350 and need to create a new file as BW3_350.sh b)to replace 248 to 380 and need to create a new file as BW3_380.sh c)to replace 248 to 320 and need to create a new file as BW3_320.sh there is no... (6 Replies)
Discussion started by: karthi_mrkg
6 Replies

8. UNIX for Dummies Questions & Answers

GREP Find & Replace <p class>

I am making an eBook. I am editing the html in BBedit. I need to replace all <p class="s5"> with just a <p>. How do I write this for GREP? Thank you, Abby (5 Replies)
Discussion started by: cuddlykitty
5 Replies

9. UNIX for Dummies Questions & Answers

Find & Replace

Hi I am looking to rename the contents of this dir, each one with a new timestamp, interval of a second for each so it the existing format is on lhs and what I want is to rename each of these to what is on rhs..hopefully it nake sense CDR.20060505.150006.gb CDR.20121211.191500.gb... (3 Replies)
Discussion started by: rob171171
3 Replies

10. UNIX for Dummies Questions & Answers

Find & Replace with same case letters

I have text with upper and lower case words. I want to find something and replace it with something new. But it should match the case - Meaning - it should replace old upper cased word with NEW upper case word and lower with lower. example: this text is very simple TEXT. now I want to replace... (5 Replies)
Discussion started by: grep_me
5 Replies
All times are GMT -4. The time now is 07:01 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy