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
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. 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