2016-10-17 2 views
0

Quelle est la différence entre le caractère 'control+M' et le caractère '\r'.Quelle est la différence entre le caractère Ctrl + M et un caractère ' r'. Et comment l'écrivons-nous?

Les deux ne sont pas identiques. Comment pouvons-nous écrire control + M caractère dans gawk comme nous écrivons '\ r'.

Mon but est de dire à gawk de prendre le caractère 'comtrol + M' comme RS (séparateur d'enregistrement).

pour '\ r' on peut écrire comme

gawk -v RS='\r' 'code goes here' file 

gawk -v RS='\r' -v ORS='\n' '{gsub(/\n/,"",$0)} {print $0}' rawfile > newfile_slashr_removed 

ici au lieu de '\r' Je veux prendre 'comtrol+M'

Contexte:

$ grep '\r' raw_file | wc 
    1468 44570 2641642 

$ grep '^M' raw_file | wc 
    1463 44522 2638958 

Après avoir utilisé le code ci-dessus et de prendre la sortie et le mettre dans le fichier,

$ grep '^M' WDY_worker_incr_newfile | wc 
     0  0  0 
$ grep '\r' WDY_worker_incr_newfile | wc 
    1464 44570 2640175 

Que se passe-t-il ici?

+0

'printf"^M "| od' imprime la même chose que 'printf" \ r "| od'. Peut-être utiliser 'grep -c' plutôt que' grep ... | wc' –

+0

Pourquoi pensez-vous que control-M et '\ r' sont différents? – Henry

+0

Henry, je vous ai montré les résultats de la commande grep sur le même fichier. Le résultat est différent. – user6613676

Répondre

3

Vous n'écrivez pas ^M, vous appuyez sur la touche Ctrl - V et puis la Ctrl - M combinaisons de touches. Le Ctrl-V initial fait que la ligne de commande du shell édite "échapper" la clé suivante - normalement, Ctrl-M sera mappé à la même action que Return dans votre shell, mais avec ceci, vous pouvez taper un Carriage Return sur la commande ligne.

Avec cela, vous pouvez alors écrire RS='^M' et grep '^M' en tapant RS=' + Ctrl - V + Ctrl - M + ' etc.

Sur une coque moderne (mksh, AT & T ksh93, GNU bash, etc.), vous pouvez également écrire RS=$'\r' et grep $'\r' à la place, la citation dollar-apostrophe interpole les séquences d'échappement de style C.

La plupart des outils ne vous permettent pas d'écrire simplement '\r'; printf et tr sont des exceptions, et il peut y en avoir d'autres, selon le système d'exploitation et les outils utilisés (par exemple, GNU sed les autorise dans plus d'endroits que BSD sed).

vous a tagué cela comme unix, mais, tout comme un autre point de prudence, sur les environnements DOS comme Cygwin32, ^M^J est le séparateur de ligne, non seulement ^J comme sur Unix bon, si les outils peuvent se conduire mal si vous voulez re -utilise le retour chariot.