Sed, сопоставьте слова (идентификаторы) в списке идентификаторов, кроме последнего - PullRequest
0 голосов
/ 08 мая 2018

Дан список идентификаторов в следующем формате:

test_one another_one lol heres1 wow_the_last

Я пытаюсь использовать sed, чтобы заменить его любым из следующих:

test_one,another_one,lol,heres1
test_one, another_one, lol, heres1
{test_one, another_one, lol, heres1}
{test_one,another_one,lol,heres1}

Я смог сделать это с помощью следующей команды sed:

sed -e 's/\(\w*\)\s/\1,/g'

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

sed -e 's/\(\w*\)^$/\1,/g'
sed -e 's/\(\w*\)[^$]/\1,/g'

Я пробовал вышеупомянутое, но первый, похоже, ничего не соответствует, а тот, что ниже, выдает следующее:

test_one,another_one,lol,heres,

1 Ответ

0 голосов
/ 08 мая 2018

Не уверен, что правильно вас понял, но с помощью awk:

$ awk 'BEGIN{OFS=","}{$1=$1;NF--;print}' file
test_one,another_one,lol,heres1

Разъяснения:

$ awk '
BEGIN { OFS="," }  # set the output field separator to a comma
{
    $1=$1          # rebuild the record, ie. use the commas
    NF--           # reduce field count by one
    print          # output
}' file
...