Convert ASCII Text, with CRLF

  1. The problem statement, all variables and given/known data:
    write a script asciiFix.sh that takes an arbitrary number of file paths from the command line and carries out the same analysis on each one. If a file is not Windows ASCII, your script should do nothing to it. For each file that is Windows ASCII, your script should print the message: converting _fileName_
    and should then convert the CR/LF line terminators in that file to Unix-style LF line terminators.

The attempts I have tried do not remove the ^M from the file. The script should be able to handle many file which I believe I can do by "$file"

  1. Relevant commands, code, scripts, algorithms:

For example:
cp ~cs252/Assignments/ftpAsst/d3.dat wintest.txt ./asciiFix.sh /usr/share/dict/words wintest.txt fileType.sh converting wintest.txt

  1. The attempts at a solution (include all code and scripts):
#!/bin/sh
file=$1
if file "$@" | grep "ASCII text, with CRLF";then
  echo "converting $file"
  sed -i 's/^M//g' "$file"
fi

I have also tried this

#!/bin/sh 
for file in "$@" 
do         
if file $file | grep "ASCII text, with CRLF"; then 
                echo "converting $file" 
                sed -i 's/^M//g' $file 
        fi   
done

Note: Without school/professor/course information, you will be banned if you post here! You must complete the entire template (not just parts of it).

In a sed substitute search pattern, ^M matches an uppercase M at the start of a line, not the <carriage-return> control character that is usually displayed as the two character sequence <circumflex><M> in vi and some other utilities.

Your assignment seems to only be to remove <carriage-return> control characters that appear immediately before a <line-feed> (AKA <newline> character). You can do that by anchoring your RE to only match a <carriage-return> at end of a line.

What OS and shell are you using?

Does your system have a dos2unix command?

If you are using vi , you can enter a literal <carriage-return> character into your script, by entering the sequence CTL-V CTL-M (hold down the control (or CTL or CNTL) key, depending on your keyboard, while you press and release the V key and then press and release the M key; then release the control key.

It does not have dos2unix . I have also tried 's/\r$//g' that didn't work. Would ''s//\r$//g' work? I am using vim I don't know if that will make a difference, but I am imputing ^M as ctrl-v ctrl-m. My os is Ubuntu I'm not sure which shell.

What is the output from the command:

od -bc file

where file is the name of the file containing the 2nd script you showed us in your 1st post:

#!/bin/sh 
for file in "$@" 
do         
if file $file | grep "ASCII text, with CRLF"; then 
                echo "converting $file" 
                sed -i 's/^M//g' $file 
        fi   
done

This will tell us how the shell and sed will interpret the command:

sed -i 's/^M//g' $file

Please also show us the exact command line you used to invoke the script above and the exact output it produced (and please use CODE tags when showing us any sample input, output, and code).

Show us the output from the command:

file ~cs252/Assignments/ftpAsst/d3.dat wintest.txt ./asciiFix.sh /usr/share/dict/words

This will tell us whether or not the grep will find anything in the files you're processing.

Whenever you're trying to debug a shell script, consider adding the command:

set -xv

into your script just after the line:

#!/bin/sh

to trace the commands the script is executing.

Sorry for thread jacking but I am working on the same assignment. I am able to use unix2dos in my script. Here is my script:

#!/bin/sh  
for file in "$@"  do         
if file $file | grep "ASCII text, with CRLF"; then              
echo "converting $file"              
dos2unix $file     
fi    
done

When the finaltest.pl is ran, this is what I get (with debugging)

Checking stage 3 
for file in "$@" 
do 
if file $file | grep "ASCII text, with CRLF"; then 
echo "converting $file" 
dos2unix $file 
fi 
done 
+ file aardvark.cpp 
+ grep ASCII text, with CRLF 
+ echo converting aardvark.cpp 
+ dos2unix aardvark.cpp dos2unix: converting file aardvark.cpp to Unix format ... 
+ + grepfile ASCII text, with CRLF  
bongo.dat 
+ + grep ASCII text, with CRLF 
file cat.dog.bak  

Failed when running: ./asciiFix.sh 'aardvark.cpp' 'bongo.dat' 'cat.dog.bak'

Try this out.

#!/bin/sh
for file in "$@"  do 
   if file "$file" | grep -q "ASCII text, with CRLF"; then 
   echo "converting $file"
   dos2unix "$file" 
fi     
done

If that doesn't working say the system does not have dos2unix installed try this.

#!/bin/sh
for file in "$@"  do
     if file "$file" | grep "ASCII text, with CRLF"; then
     echo "converting $file"
     sed -i 's/^M//g' "$file"
 fi    
done

make sure you are not outputting more than asked for.

Ahh okay I understand now about too much output. Thanks for the tip :slight_smile:

It is not actually ^M. Sed takes ^M to mean "an M at the beginning of the line", even.

tr -d '\r' < inputfile > outputfile