Perl find & replace - what am I doing wrong?


 
Thread Tools Search this Thread
Top Forums UNIX for Dummies Questions & Answers Perl find & replace - what am I doing wrong?
# 8  
Old 05-30-2013
Quote:
Originally Posted by sudon't
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, the 'd' option would delete the whole line that contains the pattern; in this case the line containing "PhoneBooth".

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.
For any regular expression engine, certain characters have a different meaning than it's literal one. For e.g., a question mark '?' would mean match the previous character zero or one time. So, if you want to tell the regex engine that you want to match a literal question mark and not want to implement the special meaning, then you have to escape it. In simple terms, escape a character if you want to use it in the literal sense, which otherwise would have a special meaning.
# 9  
Old 05-30-2013
When I downloaded your file- Compound Eye.qtz, I ran ->
Code:
file Compound\ Eye.qtz
Compound Eye.qtz: Apple binary property list

PlistBuddy operates on binary property lists (strange that it's missing on your computer). You have to convert the binary property list to xml format in order to use any of the other solutions offered.
Code:
/usr/bin/plutil -convert xml1 /path/to/file.qtz

#to convert back to binary format

/usr/bin/plutil -convert binary1 /path/to/file.qtz

# 10  
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
 
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. 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

2. 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

3. 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

4. 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

5. 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

6. 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

7. 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

8. 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

9. 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

10. 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
Login or Register to Ask a Question