Domanda

Voglio cercare file contenenti terminazioni di riga dos con grep su Linux.Qualcosa come questo:

grep -IUr --color '\r\n' .

Quanto sopra sembra corrispondere alla lettera rn che non è ciò che si desidera.

L'output di questo verrà convogliato tramite xargs in todos per convertire crlf in lf in questo modo

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
È stato utile?

Soluzione

Utilizzo Ctrl+V, Ctrl+M per inserire un carattere Carriage Return letterale nella stringa grep.COSÌ:

grep -IUr --color "^M"

funzionerà - se il ^M c'è un CR letterale che inserisci come ho suggerito.

Se vuoi l'elenco dei file, vuoi aggiungere il file -l anche l'opzione.

Spiegazione

  • -I ignorare i file binari
  • -U impedisce a grep di rimuovere i caratteri CR.Per impostazione predefinita lo farebbe se decide che è un file di testo.
  • -r leggere ricorsivamente tutti i file in ciascuna directory.

Altri suggerimenti

grep probabilmente non è lo strumento che desideri per questo.Stamperà una riga per ogni riga corrispondente in ogni file.A meno che tu non voglia, ad esempio, eseguire todos 10 volte su un file di 10 righe, grep non è il modo migliore per farlo.Utilizzando find per eseguire il file su ogni file nell'albero, quindi eseguendo il grepping per "CRLF" otterrai una riga di output per ogni file che ha terminazioni di riga in stile dos:

find . -not -type d -exec file "{}" ";" | grep CRLF

otterrai 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

Se la tua versione di grep supporta -P (--perl-regexp) opzione, quindi

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 "Cerca..."Ho un problema simile...Qualcuno ha inviato i termini della linea mista nel controllo della versione, quindi ora abbiamo un sacco di file con 0x0d 0x0d 0x0a terminazioni di linea.Notare che

grep -P '\x0d\x0a'

trova tutte le righe, mentre

grep -P '\x0d\x0d\x0a'

E

grep -P '\x0d\x0d'

Non trova linee, quindi potrebbe esserci qualcosa di "altro" in corso all'interno di Grep quando si tratta di modelli di fine della linea ...purtroppo per me!

Se, come me, il tuo UNIX minimalista non include sottigliezze come il file comando e barre rovesciate nel tuo grep le espressioni semplicemente non collaborano, 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:

  • modificare il Trovare comando per individuare solo i file che desideri scansionare
  • cambiare il scarico comando a od o qualunque utilità di dump dei file tu abbia
  • confermare che il taglio Il comando include sia uno spazio iniziale che uno finale, nonché solo il carattere esadecimale restituito dal file scarico utilità
  • limitare il scarico output ai primi 1000 caratteri circa per efficienza

Ad esempio, qualcosa di simile potrebbe funzionare per te utilizzando od invece di scarico:

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'

È possibile utilizzare il comando file in Unix.Ti fornisce 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  
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top