Используйте sed для замены букв [az] и [AZ] и ['] на подчеркивания - PullRequest
2 голосов
/ 19 июня 2019

... для всех символов, кроме первой буквы каждого слова в строке, исключая первое слово.Весь текст на английском языке.

Хотелось бы использовать sed для преобразования ввода следующим образом:

Mary had a little lamb
It's fleece was white as snow

в следующее:

Mary h__ a l_____ l___
It's f_____ w__ w____ a_ s___

Для проекта, который просматривает вызов вызова.

Посмотрел несколько вступлений к sed и regex.Будет использовать аромат sed на терминале, поставляемом с MacOS 10.14.5.

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Это может сработать для вас (GNU sed):

sed -E 'h;y/'\''/x/;s/\B./_/g;G;s/\S+\s*(.*)\n(\S+\s*).*/\2\1/' file

Сделать копию текущей строки в области удержания. Переведите ' в `x, чтобы такие слова могли быть заполнены символами подчеркивания, отличными от первой буквы каждого слова. Добавьте скопированную строку и с помощью группировки и обратных ссылок замените первое слово строки без изменений.

1 голос
/ 20 июня 2019

sed предназначен для выполнения простых операций s / old / new над отдельными строками, , то есть все . Для всего остального вы должны использовать awk, например с GNU awk для соответствия 3-го аргумента ():

$ 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___

С любым awk в любой оболочке на каждом компьютере UNIX, включая awk по умолчанию в 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___
0 голосов
/ 20 июня 2019

Вот еще один awk сценарий (все awk версии), который мне нравилось создавать для этого квеста.

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

пробег:

awk -f script.awk input.txt

это также может быть сжато в одну строку:

awk '{for (i = 2; i <= NF; i++) $i = substr($i,1,1) substr("____________________________", 1, length($i) - 1); print }' input.txt

вывод:

Mary h__ a l_____ l____
It's f_____ w__ w____ a_ s___

Мне понравилось это задание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...