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

2
Ratières 19 juin 2019 à 22:44

3 réponses

Meilleure réponse

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.

0
Dudi Boy 20 juin 2019 à 14:48

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.

2
potong 19 juin 2019 à 22:55

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___
1
Ed Morton 20 juin 2019 à 13:11