Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Perl > Perl Misc > Isolate lines in a text file and perform replacements

Reply
Thread Tools

Isolate lines in a text file and perform replacements

 
 
Robert Neville
Guest
Posts: n/a
 
      03-30-2007
I developed a shell script for renaming my mp3 files. I understand
that this newsgroup revolves around Perl, yet my script uses Perl for
full regular expression support (so I don't have to escape the
patterns in sed). I just need fresh ideas for my shell script, which
may involve the Perl portions.

The script uses Perl and regular expressions to normalize the file
names. The patterns reside in a preset file. My current development
efforts involve applying these regex patterns to playlist and xml
files. I want to process the text inside these files. Eventually, the
script would help me rename my itunes database, yet it has several
purposes beyond mp3 renaming.

The script performs a recursive search and finds files with these
extensions (m3u, sfv, and xml). It iterates (while loop) through an
external file with regular expression patterns. Then it combines the
patterns and placed them in a variable, which is passed to Perl. The
script below performs this task (yet has not been thorough tested). It
has a major shortcoming that the Perl line works on the entire file
when it should only replace the lines with mp3 pointers. Here's the
call for assistance since I am having code block. Maybe, someone could
help me with different logic or a traditional grep solution.

find ./ -regex ".*\(m3u\|sfv\|xml\)$" -type f -print | while read FILE
do
while read -r REGEX REPLACE line
do
CODE="$CODE; s/$REGEX/$REPLACE/g"
done < "$PRESET"
echo "$CODE"
echo "perl -pi.bak -e "s/$REGEX/$REPLACE/g" $FILE"
#PRESET may contain over twenty five regex patterns
done

btw I am doing this script in Bash, because Perl is foreign territory.
 
Reply With Quote
 
 
 
 
usenet@DavidFilmer.com
Guest
Posts: n/a
 
      03-30-2007
On Mar 30, 11:16 am, Robert Neville <(E-Mail Removed)>
wrote:

> It has a major shortcoming that the Perl line works on the entire file


That's because you told Perl to work on the entire file.

> Maybe, someone could help me with different logic or a traditional
> grep solution.


You want to selectively alter MP3 tags, right? And you don't want
your alterations to accidentally apply so some other data in the file,
right?

To do this "properly" you need program logic which can identify
specific tags, and only operate on those tags. That's gonna be hard
to do when most of the code is a korn script.

> btw I am doing this script in Bash, because Perl is foreign territory.


Then I respectfully submit that you ought to learn a little Perl,
because Perl will make this task (and many others) rather simple. In
fact, you can use a CPAN module (such as MP3::Info, my personal
favorite) to do most of the work (it will allow you to query and
modify specific tags).

If you post a specific example of which tag you want to modify, and a
few specific regexps you wish to apply, someone (maybe me) might post
a bit of sample code to get you started.


--
The best way to get a good answer is to ask a good question.
David Filmer (http://DavidFilmer.com)

 
Reply With Quote
 
 
 
 
Mumia W.
Guest
Posts: n/a
 
      03-30-2007
On 03/30/2007 01:16 PM, Robert Neville wrote:
> [...] script below performs this task (yet has not been thorough tested). It
> has a major shortcoming that the Perl line works on the entire file
> when it should only replace the lines with mp3 pointers. Here's the
> call for assistance since I am having code block. Maybe, someone could
> help me with different logic or a traditional grep solution.
>
> find ./ -regex ".*\(m3u\|sfv\|xml\)$" -type f -print | while read FILE
> do
> while read -r REGEX REPLACE line
> do
> CODE="$CODE; s/$REGEX/$REPLACE/g"
> done < "$PRESET"
> echo "$CODE"
> echo "perl -pi.bak -e "s/$REGEX/$REPLACE/g" $FILE"


Is this what you're looking for?

echo "perl -pi.bak -e \"s/$REGEX/$REPLACE/g if /\.mp3\b/\" $FILE"


> #PRESET may contain over twenty five regex patterns
> done
>
> btw I am doing this script in Bash, because Perl is foreign territory.



 
Reply With Quote
 
Robert Neville
Guest
Posts: n/a
 
      04-03-2007
On Fri, 30 Mar 2007 20:53:45 GMT, "Mumia W."
<(E-Mail Removed)> wrote:

>On 03/30/2007 01:16 PM, Robert Neville wrote:
>> [...] script below performs this task (yet has not been thorough tested). It
>> has a major shortcoming that the Perl line works on the entire file
>> when it should only replace the lines with mp3 pointers. Here's the
>> call for assistance since I am having code block. Maybe, someone could
>> help me with different logic or a traditional grep solution.
>>
>> find ./ -regex ".*\(m3u\|sfv\|xml\)$" -type f -print | while read FILE
>> do
>> while read -r REGEX REPLACE line
>> do
>> CODE="$CODE; s/$REGEX/$REPLACE/g"
>> done < "$PRESET"
>> echo "$CODE"
>> echo "perl -pi.bak -e "s/$REGEX/$REPLACE/g" $FILE"

>
>Is this what you're looking for?
>
>echo "perl -pi.bak -e \"s/$REGEX/$REPLACE/g if /\.mp3\b/\" $FILE"
>
>
>> #PRESET may contain over twenty five regex patterns
>> done
>>
>> btw I am doing this script in Bash, because Perl is foreign territory.

>

Thanks Mumia

This approach looks like a strong possibility. How would I search for
more information on this construct? The perl man page is extensive and
the "if" keyword is too general. Please let me know if you have links
or examples where this construct has been used. Here's the pseudo code
from your suggestion.


find ./ -regex ".*\(m3u\|sfv\|xml\)$" -type f -print | while read FILE
do
while read -r REGEX REPLACE line
do
CODE="$CODE; s/$REGEX/$REPLACE/g"
done < "$PRESET"
#PRESET may contain over twenty five regex patterns
perl -pi.bak -e \""$CODE" if /\.mp3\b/\" "$FILE"
done
 
Reply With Quote
 
Mumia W.
Guest
Posts: n/a
 
      04-03-2007
On 04/02/2007 09:43 PM, Robert Neville wrote:
> On Fri, 30 Mar 2007 20:53:45 GMT, "Mumia W."
> <(E-Mail Removed)> wrote:
>
>> On 03/30/2007 01:16 PM, Robert Neville wrote:
>>> [...] script below performs this task (yet has not been thorough tested). It
>>> has a major shortcoming that the Perl line works on the entire file
>>> when it should only replace the lines with mp3 pointers. Here's the
>>> call for assistance since I am having code block. Maybe, someone could
>>> help me with different logic or a traditional grep solution.
>>>
>>> find ./ -regex ".*\(m3u\|sfv\|xml\)$" -type f -print | while read FILE
>>> do
>>> while read -r REGEX REPLACE line
>>> do
>>> CODE="$CODE; s/$REGEX/$REPLACE/g"
>>> done < "$PRESET"
>>> echo "$CODE"
>>> echo "perl -pi.bak -e "s/$REGEX/$REPLACE/g" $FILE"

>> Is this what you're looking for?
>>
>> echo "perl -pi.bak -e \"s/$REGEX/$REPLACE/g if /\.mp3\b/\" $FILE"
>>
>>
>>> #PRESET may contain over twenty five regex patterns
>>> done
>>>
>>> btw I am doing this script in Bash, because Perl is foreign territory.

> Thanks Mumia
>
> This approach looks like a strong possibility. How would I search for
> more information on this construct? The perl man page is extensive and
> the "if" keyword is too general. Please let me know if you have links
> or examples where this construct has been used. Here's the pseudo code
> from your suggestion.
>
>
> find ./ -regex ".*\(m3u\|sfv\|xml\)$" -type f -print | while read FILE
> do
> while read -r REGEX REPLACE line
> do
> CODE="$CODE; s/$REGEX/$REPLACE/g"
> done < "$PRESET"
> #PRESET may contain over twenty five regex patterns
> perl -pi.bak -e \""$CODE" if /\.mp3\b/\" "$FILE"
> done


The information is located in several places. Perlretut talks about
"\b". /Somewhere/ in the documentation the need to backslash
double-quotes within double-quoted strings is discussed; however, that
is not needed for the "perl" command above.

I would write it like so:

perl -pi.bak -e "$CODE if /\.mp3\b/" "$FILE"



 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
multiple text replacements from a hash George Mpouras Perl Misc 2 04-01-2013 07:36 PM
web config file section replacements ThatsIT.net.au ASP .Net 3 09-27-2008 02:26 AM
Web Deployment Project and web.config file section replacements?? Brian McCullough ASP .Net 0 02-16-2007 09:55 PM
To delete few lines and add few lines at the end of a text file using c program Murali C++ 2 03-09-2006 04:45 PM
Re: how to read 10 lines from a 200 lines file and write to a new file?? Joe Wright C Programming 0 07-27-2003 08:50 PM



Advertisments