Strona główna Ubuntu C++ Hardware HTML i javascript Java Software SQL

Awk|Bash – usuwanie znaku ^M (Control-M lub carriage return) z plików.

Dodano: 2012-09-08

Pobierając skrypt dla systemu linux, możemy napotkać problem z jego uruchomieniem, objawiający się komunikatem:

-bash: ./c.bash: /bin/bash^M: bad interpreter: No such file or directory

Komunikat ten świadczy o tym, że skrypt został edytowany lub stworzony w systemie Windows i w czasie zapisu zostały użyte znaki niedozwolone (dokładnie jednego na końcu linii: \r) dla systemu linux.

W internecie istnieje kilka przykładów skryptów, które umożliwiają przepisanie pliku i usunięcie zakazanych (cenzura ;p) znaków. Na tej stronie Konwertowanie plików z Windowsa do Linuksa jest kilka przykładów jak o zrobić szybko i bezboleśnie ;)

Poniżej skrypt w bash i awk, który przeszukuje folder i w przypadku gdy użytkownik tego chce (podając odpowiedni parametr) przepisuje pliki usuwając znak '\r' z końca linii. Więcej informacji wpisz (zakładając, że skrypt nazywa się „isDosFile.bash”):

./isDosFile.bash --help

#!/bin/bash

if [ "$1" == "--help" ]; then
	echo "Script to find files that are on the end of line character \"\\r\"";
	echo "You can run script without parameters.";
	echo "The results are the names of the file with flag:";
	echo "0 - file do not have char";
	echo "1 - file have char";
	echo;
	echo "You can add tow parameters:";
	echo "[optional] - destination folder, but always must be first parameter"
	echo "-r - rewrite file without char \"\\r\"";

	exit 0;
fi;


if [ "$2" == "-r" -o "$1" == "-r" ]; then
	option=1;
else
	option=0;	
fi;

if [ "$1" = ""  -o "$1" = "-r" ]; then
	DEST=`pwd`"/";
else
	if [ ! -d $1 ]; then
		echo "";
		echo "The argument \""$1"\" is not directory!!!";
		echo "";
		exit 1;
	fi;
	DEST=$1"/";
fi;



for file in $DEST*; do 
	if [ -f "$file" ]; then
		awk -vo=$option 'BEGIN{
			flag=0;
		}{
			if (index($0, "\r") != 0){
				flag = 1;
				exit;
			}
		}END{
			if (flag == 1){
				print "1 '"$file"'";
				if (o == 1){
					system("rm -f dos2unix.temp");
					system("tr -d '\\15\\32' < \"'"$file"'\" > dos2unix.temp");
					system("mv dos2unix.temp \"'"$file"'\"");
				}
			}else
				print "0 '"$file"'";

			
		}' "$file";
	fi;
done

echo "End script.";