Supprimer les nouveaux caractères de ligne dans une chaîne entre guillemets dans unix

J’ai un fichier texte qui va comme ceci:

abc 123 xyz "abc 123" xyz 

Je veux remplacer les nouvelles lignes par un espace (”) si la nouvelle ligne apparaît dans une chaîne entre guillemets. Je veux donc une sortie:

 abc 123 xyz abc 123 xyz 

Est-il possible d’écrire un programme dans Unix pour cela?

Vous pouvez imprimer une nouvelle ligne ou juste un espace en fonction du nombre de " comment ça s’est passé”. De cette façon, une nouvelle ligne sera simplement imprimée si nous fermons des guillemets.

 $ awk '{n=split($0,a,"\""); val+=(n-1); gsub("\"",""); printf "%s%s", $0, (val%2?" ":"\n")}' file abc 123 xyz abc 123 xyz 

Explication

  • n=split($0,a,"\"") compte combien " apparaissent dans la ligne courante. Comme split() renvoie le nombre de morceaux basés sur " comme délimiteur, au moins nous obtenons une valeur de 1 .
  • val+=(n-1) garde la trace du solde. -1 pour simplement compter le nombre de guillemets, car le fractionnement en retourne un de plus que nécessaire.
  • gsub("\"","") supprime les guillemets dans la chaîne.
  • printf "%s%s", $0, (val%2?" ":"\n") imprime la ligne avec un espace ou une nouvelle ligne. Si val est multiple de 2, nouvelle ligne; sinon, espace.

Tester

Un autre exemple:

 $ cat a abc 123 xyz "abc hee 123" xyz and "this is not everything" $ awk '{n=split($0,a,"\""); val+=(n-1); gsub("\"",""); printf "%s%s", $0, (val%2?" ":"\n")}' a abc 123 xyz abc hee 123 xyz and this is not everything