... pour tous les caractères sauf la première lettre de chaque mot sur une ligne à l'exclusion du premier mot. Tout le texte est en anglais.
Voudrait utiliser sed pour convertir l'entrée comme ceci:
Mary had a little lamb
It's fleece was white as snow
Pour ça:
Mary h__ a l_____ l___
It's f_____ w__ w____ a_ s___
Pour un projet qui s'intéresse au rappel indicé.
Regardé plusieurs intros à sed et regex. Utiliserait la saveur de sed sur le terminal livré avec MacOS 10.14.5.
3 réponses
Voici un autre script awk
(toutes les versions awk
), que j'ai aimé créer pour cette quête.
script.awk
{
for (i = 2; i <= NF; i++) { # for each input word starting from 2nd word
head = substr($i,1,1); # output word head is first letter from current field
tail = substr("____________________________", 1, length($i) - 1); # output word tail is computed from template word
$i = head tail; # recreate current input word from head and tail
}
print; # output the converted line
}
input.txt
Mary had a little lamb
It's fleece was white as snow
Courir:
awk -f script.awk input.txt
Cela pourrait également être condensé en une seule ligne:
awk '{for (i = 2; i <= NF; i++) $i = substr($i,1,1) substr("____________________________", 1, length($i) - 1); print }' input.txt
La sortie est:
Mary h__ a l_____ l____
It's f_____ w__ w____ a_ s___
J'ai apprécié cette tâche.
Cela pourrait fonctionner pour vous (GNU sed):
sed -E 'h;y/'\''/x/;s/\B./_/g;G;s/\S+\s*(.*)\n(\S+\s*).*/\2\1/' file
Faites une copie de la ligne actuelle dans l'espace d'attente. Traduisez les '
en `x pour que ces mots puissent être remplis avec des traits de soulignement autres que la première lettre de chaque mot. Ajoutez la ligne copiée et en utilisant le regroupement et les références arrière, remplacez le premier mot de la ligne sans altération.
Sed sert à effectuer de simples opérations s / anciennes / nouvelles sur des chaînes individuelles, c'est tout . Pour toute autre chose, vous devriez utiliser awk, par exemple avec GNU awk pour le 3ème argument à correspondre ():
$ awk '{
out = $1
$1 = ""
while ( match($0,/(\S)(\S*)(.*)/,a) ) {
out = out OFS a[1] gensub(/./,"_","g",a[2])
$0 = a[3]
}
print out $0
}' file
Mary h__ a l_____ l___
It's f_____ w__ w____ a_ s___
Avec n'importe quel awk dans n'importe quel shell sur chaque boîte UNIX, y compris le awk par défaut sur MacOS:
$ awk '{
out = $1
$1 = ""
while ( match($0,/[^[:space:]][^[:space:]]*/) ) {
str = substr($0,RSTART+1,RLENGTH-1)
gsub(/./,"_",str)
out = out OFS substr($0,RSTART,1) str
$0 = substr($0,RSTART+RLENGTH)
}
print out $0
}' file
Mary h__ a l_____ l___
It's f_____ w__ w____ a_ s___
Questions connexes
De nouvelles questions
regex
Les expressions régulières fournissent un langage déclaratif pour faire correspondre les modèles dans les chaînes. Ils sont couramment utilisés pour la validation, l'analyse et la transformation de chaînes. Étant donné que les expressions régulières ne sont pas entièrement standardisées, toutes les questions avec cette balise doivent également inclure une balise spécifiant le langage de programmation ou l'outil applicable.