Extend sed command over multiple lines

I am trying to extend a single sed command over multiple lines in a bash file. I have several patterns that sed checks for, and I hope to separate some patterns by changing the line. Here is my current script that does not work, everything works on the same line, but I was hoping to clean it up a bit and split it up.

#!/bin/sh -f #files=$(ls -1 | egrep '.avi|.mkv'); #echo $files for f in *.mkv *.avi; do renF=`echo $f | tr '.' ' ' | sed -e 's/ \([^ ]*\)$/.\1/; s/\ \[sharethefiles\ com\]//i' \ -e 's/\ x264\-Ctu//i; s/\ x264\-Bia//i; s/\ x264\-Fov//i' \ -e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ -e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm' \ -e 's/\ Dts\-Chd//i; s/\ WEB\-DL//i; s/\ H264\-SURFER//i' \ -e 's/\ Dsr//; s/\ WS//i; s/\ PDTV//i; s/\ X264//i; s/\ Blu\-Ray//; s/\ Bdrip//i; s/\ Bluray//i; s/\ HDTV//i; s/\ DTS//i; s/\ AC3//i; s/\ Dd5//i; s/\ Dualaudio//i; s/\ AAC2//i; s/\ XVID//i'` #echo $renF if [ "$f" == "$renF" ]; then echo "FileName already cleaned." else mv "$f" "$renF" fi done 

Thanks for any help!

+6
bash sed
source share
3 answers

The problem is in this line:

 -e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 

There is no s/ . It should be:

 -e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; s/\ Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 

I have included backslash for consistency.

This line is missing //i :

 -e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm 

Fixed:

 -e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm//i 

The error messages I received led me to the source of the errors:

 sed: -e expression #3, char 93: unknown command: `X' 

and

 sed: -e expression #4, char 51: unterminated `s' command 

Here's a suggestion on how to make this more readable and maintainable:

 while read -r pattern do sedscript+="$pattern;" done <<EOF s/ \([^ ]*\)$/.\1/ s/\ \[sharethefiles\ com\]//i s/\ x264\-Ctu//i s/\ x264\-Bia//i ... s/\ XVID//i EOF renF=$(echo $f | tr '.' ' ' | sed -e "$sedscript") 
+6
source share

Not sure if I understand you, but you can do something similar if you just want to have several lines of sed expressions:

 v=`echo 123|sed 's/1/2/ s/2/3/ s/3/4/'`; echo $v 

Shows 423 , as expected.

If you want this on one line, this is also possible:

 v=`echo 123|sed 's/1/2/ ; s/2/3/ ; s/3/4/'`; echo $v 

gives the same result.

For what I see, I would suggest doing this in several lines, as you already did, just putting everything on a separate line, since I think it is more readable. Something like:

 v=`echo 123|sed \ -e 's/1/2/' \ -e 's/2/3/' \ -e 's/3/4/'` echo $v 

See this link for more information:

under Quoting multiple sed lines in the Bourne shell

+3
source share

Perhaps a better alternative would be to use heredoc if GNU sed is available (not built into OSX):

 sed -f - "$IN" > "$OUT" << SED_SCRIPT s/a/1/g s/test/full/g SED_SCRIPT 

Source: https://unix.stackexchange.com/questions/45591/using-a-here-doc-for-sed-and-a-file

+1
source share

All Articles