Как изменить диапазон текста между двумя символами? awk, sed, regex

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

Другой вариант - использовать blkid для получения уникального идентификатора каждого диска.

1
задан 25 April 2015 в 05:18

4 ответа

В sed вы можете скопировать «специальную» строку в удержание перед удалением

sed -e '/^\*/{h;d;}'

, а затем добавить пространство удержания в каждое последующее пространство шаблонов, заменив полученную новую строку и маркер character

    -e '{G;s/\n\*//;}'

Тестирование его с вашими данными,

$ sed -e '/^\*/{h;d;}' -e '{G;s/\n\*//;}' file
strawberry
raspberry
blueberry
boysenberry
blahblah
blahblah
blahblah
strawberry
blueberry
blah
vegetable
pingpongtable

Примечание: это не останавливается, когда он встречает вторую звездочку; он делает то же самое, но добавляет *, а затем ничего - до тех пор, пока он не будет соответствовать следующему *sometext.

8
ответ дан 23 May 2018 в 21:03
  • 1
    Интересно, я никогда не видел «пространство для удержания». тактика, спасибо за новый урок в седе. Ваш код также отлично работал с моим файлом, спасибо, у вас отличный день! – TuxForLife 25 April 2015 в 05:16

Вот путь Perl:

$ perl -lne '/^\*(.*)/ || print "$_$1"' file
strawberry
raspberry
blueberry
boysenberry
blahblah
blahblah
blahblah
strawberry
blueberry
blah
vegetable
pingpongtable

Объяснение

-n заставит Perl читать каждую строку входного файла, сохраняя его в специальной переменной $_, -l приведет к тому, что i) отделит последние строки (\n) от каждой строки и ii) добавит новую строку для каждого вызова print. [F8] - это скрипт, который применяется к каждой строке.

/^\*(.*)/: строки соответствия, начинающиеся со звездочки и сохраняющие все после звездочки как $1 (вот что делают круглые скобки). || print "$_$1"': || является логическим OR. Поэтому print будет выполняться только в том случае, если текущая строка не начиналась со звездочки. Если это так, мы печатаем текущую строку ($_) вместе с тем, что в настоящее время сохраняется как $1 (шаблон, следующий за звездочкой).

Как обычно, есть много способов сделать это. Глупый и неэффективный, но тот, который выделяет возможности манипуляции с строкой оболочки, это:

$ while read line; do 
    [[ $line =~ ^\* ]] && pat="${line#\*}" || printf "%s%s\n" "$line" "$pat"; 
  done < file
strawberry
raspberry
blueberry
boysenberry
blahblah
blahblah
blahblah
strawberry
blueberry
blah
vegetable
pingpongtable

Пояснение

/^\*(.*)/: строки соответствия, начинающиеся с звездочку и сохранить все после звездочки как $1 (вот что в скобках). [[ $line =~ ^\* ]] && pat="${line#\*}": если строка начинается с *, после этого удалите все (это то, что делает ${line#\*}, более подробно см. здесь) и сохраните его как $pat. * || printf "%s%s\n" "$line" "$pat";: если предыдущая команда не удалась (поэтому строка не начинается со звездочки), напечатайте строку и текущее значение $pat.
7
ответ дан 23 May 2018 в 21:03

Через мой любимый Python ...

with open('/path/to/the/file') as f:
    counter = False
    for line in f:
        if line.startswith('*') and not counter:
            m = line.strip().lstrip('*')
            counter = True
        elif line.startswith('*') and counter:
            counter = False    
        elif counter:
            if not line.startswith('*'):
                print(line.strip() + m)
        else:
            print(line.strip())  
3
ответ дан 23 May 2018 в 21:03

Пришел сюда поздно. Вот еще один подход python:

#!/usr/bin/env python2
with open('/path/to/file.txt') as f:
    for lines in f.read().split('*'):
        entries = lines.rstrip().split('\n')
        for i in range(1, len(entries)):
            print entries[i] + entries[0]
3
ответ дан 23 May 2018 в 21:03

Другие вопросы по тегам:

Похожие вопросы: