Voglio cercare i file che contengono le terminazioni Dos Line con grep su Linux. Qualcosa come questo:
grep -IUr --color '\r\n' .
Quanto sopra sembra corrispondere letteralmente a rn
che non è ciò che si desidera.
L'output di questo verrà reindirizzato attraverso xargs in todos per convertire crlf in lf in questo modo
grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
Uso Ctrl+V, Ctrl+M per inserire un carattere letterale di ritorno a capo nella tua stringa grep. Così:
grep -IUr --color "^M"
funzionerà - se il ^M
c'è un CR letterale che inserisci come ho suggerito.
Se si desidera l'elenco di file, si desidera aggiungere il -l
opzione pure.
Spiegazione
-I
ignora i file binari-U
impedisce a grep di eliminare i caratteri CR. Di default lo farebbe se decidesse che è un file di testo.-r
legge tutti i file in ciascuna directory in modo ricorsivo.grep probabilmente non è lo strumento che desideri per questo. Stampa una riga per ogni riga corrispondente in ogni file. A meno che tu non voglia, per esempio, eseguire todos 10 volte su un file di 10 righe, grep non è il modo migliore per farlo. Usando find per eseguire il file su ogni file nella struttura, quindi scorrendo quello per "CRLF" otterrai una riga di output per ogni file che ha terminazioni di riga di stile DOS:
find . -not -type d -exec file "{}" ";" | grep CRLF
ti darà qualcosa del tipo:
./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators
grep -IUlr $'\r'
Se la tua versione di grep supporta - P (--Perl-regexp) opzione, allora
grep -lUP '\r$'
potrebbe essere usato.
# list files containing dos line endings (CRLF)
cr="$(printf "\r")" # alternative to ctrl-V ctrl-M
grep -Ilsr "${cr}$" .
grep -Ilsr $'\r$' . # yet another & even shorter alternative
La query era ricerca ... Ho un problema simile ... qualcuno ha inviato terminazioni di riga miste nel controllo versione, quindi ora abbiamo un mucchio di file con 0x0d
0x0d
0x0a
terminazioni di riga. Nota che
grep -P '\x0d\x0a'
trova tutte le linee, mentre
grep -P '\x0d\x0d\x0a'
e
grep -P '\x0d\x0d'
non trova linee, quindi potrebbe esserci qualcosa "altro" all'interno di grep quando si tratta di schemi di fine linea ... purtroppo per me!
È possibile utilizzare il comando file in unix. Ti dà la codifica dei caratteri del file insieme ai terminatori di riga.
$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF
Se, come me, il tuo unix minimalista non include bellezze come il comando file e le barre rovesciate nelle espressioni grep semplicemente non cooperano, prova questo:
$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done
Le modifiche che potresti voler apportare a quanto sopra includono:
Ad esempio, qualcosa del genere potrebbe funzionare per te usando od invece di dump:
od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'