GNU/Linux >> Tutoriels Linux >  >> Linux

Fusionner 3 lignes consécutives avec Swap ?

Hé, j'ai besoin de fusionner trois lignes consécutives avec un échange entre la 2ème et la 3ème ligne dans "fichier":

$cat file
Object Name: A
    comments: comment A
    manual_encdomain: Name: A 
Object Name: B
    comments: comment B
    manual_encdomain: Name: B 

Donc au lieu de sortir ci-dessous :

$sed 'N;N;s/n/ /g' file 
Object Name: A comments: comment A manual_encdomain: Name: A 
Object Name: B comments: comment B manual_encdomain: Name: B

J'aurais plutôt besoin de ça

Object Name: A manual_encdomain: Name: A comments: comment A
Object Name: B manual_encdomain: Name: B comments: comment B

sed, awk n'importe quoi

Réponse acceptée :

Oui, vous pouvez utiliser sed pour échanger des lignes :

$ sed -E 'N;N;s/n([^n]*)n([^n]*)/ 2 1/' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

Ou, de façon équivalente :

$ sed  'N;N;s/n([^n]*)n([^n]*)/ 2 1/g' file
Object Name: A     manual_encdomain: Name: A      comments: comment A
Object Name: B     manual_encdomain: Name: B      comments: comment B

Comment ça marche :

  • -E

    Cela active les expressions régulières étendues. (-E fonctionne à la fois sur BSD (OSX) sed et GNU sed moderne. Pour les anciennes versions de GNU sed, utilisez -r à la place.)

    Sans regex étendu, nous devons échapper ( et ) comme indiqué ci-dessus.

  • N;N

    Cela se lit dans les deuxième et troisième lignes.

  • s/n([^n]*)n([^n]*)/ 2 1/

    Cela échange les deuxième et troisième lignes. La première occurrence de n([^n]*) capture la deuxième ligne et l'enregistre dans le groupe de capture 1. La deuxième occurrence de n([^n]*) capture la troisième ligne et l'enregistre dans le groupe de capture 2. Le texte de remplacement, 2 1 échange la position tout en remplaçant les retours à la ligne par des espaces.

Suppression des espaces blancs en excès

Les deuxième et troisième lignes sont indentées dans le fichier d'entrée. Si nous voulons supprimer cet espace blanc supplémentaire :

$ sed -E 'N;N;s/n[[:blank:]]*([^n]*)n[[:blank:]]*([^n]*)/ 2 1/g' file
Object Name: A manual_encdomain: Name: A  comments: comment A
Object Name: B manual_encdomain: Name: B  comments: comment B

[[:blank:]] est le moyen sécurisé Unicode de faire correspondre les blancs et les tabulations.


Linux
  1. Fusionner des dossiers avec Mv ?

  2. Insérer de nouvelles lignes avec des valeurs manquantes (na) ?

  3. Utiliser Word Wrap avec Mc ?

  4. Trouver tous les fichiers dont le nom contient une chaîne

  5. `npm install` se termine par Killed

Comment déployer une application multiniveau avec Kubernetes

Gérer la sécurité du réseau avec Firewalld à l'aide de lignes de commande

Premiers pas avec les playbooks Ansible

Problème avec Swap dans Ubuntu 18.04 ?

Installation d'OpenCart 2.0 avec Softaculous

Problèmes avec la fusion des comptes cPanel