Isolate lines in a text file and perform replacements

R

Robert Neville

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

usenet

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

Mumia W.

[...] 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"
 
R

Robert Neville

[...] 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
 
M

Mumia W.

[...] 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"
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,982
Messages
2,570,189
Members
46,735
Latest member
HikmatRamazanov

Latest Threads

Top