sed, замените глобально разделитель на первую часть строки - PullRequest
1 голос
/ 04 июля 2011

Допустим, у меня есть следующие строки:

1:a:b:c
2:d:e:f
3:a:b
4:a:b:c:d:e:f

как я могу отредактировать это с помощью sed (или perl), чтобы прочитать:

1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f

Я сделал с awk вот так:

awk -F':' '{gsub(/:/, $1, $0); print $0}'

, но на это уходит много времени! Так что ищем что-то быстрее.

Ответы [ 3 ]

2 голосов
/ 04 июля 2011

'Это немного сложно, но это можно сделать с помощью sed (при условии, что файл data содержит образец ввода):

$ sed '/^\(.\):/{
s//\1/
: retry
s/^\(.\)\([^:]*\):/\1\2\1/
t retry
}' data
1a1b1c
2d2e2f
3a3b
4a4b4c4d4e4f
$

Возможно, вы сможете свести скрипт в одну строку с помощью точек с запятой; sed в MacOS X иногда немного капризный и не подходит для некоторых частей, поэтому он разбит на 6 строк. Первая строка соответствует строкам, начинающимся с одного символа и двоеточия, и запускает последовательность операций, когда это распознается. Первая замена заменяет, например, «1:» на «1». : retry также является меткой для ветвления - ключевая часть этого. Следующая подстановка копирует первый символ в строке над первым двоеточием. t retry возвращается к метке, если замена изменила что-либо. Последняя строка ограничивает всю последовательность операций для первоначально сопоставленной строки.

2 голосов
/ 04 июля 2011
#!/usr/bin/perl
use warnings;
use strict;

while (<DATA>) {
    if ( s/^([^:]+)// ) {
        my $delim = $1;
        s/:/$delim/g;
    }
    print;
}

__DATA__
1:a:b:c
2:d:e:f
3:a:b
4:a:b:c:d:e:f
1 голос
/ 04 июля 2011
use feature qw/ say /;
use strict;
use warnings;
while( <DATA> ) {
    chomp;
    my @elements = split /:/;
    my $interject = shift @elements;
    local $" = $interject;
    say $interject, "@elements";
}

__DATA__
1:a:b:c
2:d:e:f
3:a:b
4:a:b:c:d:e:f

Или в командной строке оболочки Linux:

perl -aF/:/ -pe '$i=shift @F;$_=$i.join $i,@F;' infile.txt

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