it-swarm-eu.dev

Come si cercano i file contenenti terminazioni Dos Line (CRLF) con grep su Linux?

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'
113
Tim Abell

Uso Ctrl+VCtrl+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.
110
pjz

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
143
Thomee
49
Steven Penny

Se la tua versione di grep supporta - P (--Perl-regexp) opzione, allora

grep -lUP '\r$'

potrebbe essere usato.

16
Linulin
# 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
7
yabt

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 0x0d0x0d0x0a 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!

3
Peter Y

È 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:

  • Modifica il comando find per individuare solo i file che desideri scansionare
  • cambia il comando dump in od o qualunque utilità di dump del file tu abbia
  • confermare che il comando cut include sia uno spazio iniziale sia uno finale, nonché solo l'output di caratteri esadecimali dall'utilità dump
  • limitare l'uscita dump ai primi 1000 caratteri circa per efficienza

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$'
1
MykennaC