При форматировании дисков вы можете дать им уникальный ярлык, чтобы вы могли различать их после.
Другой вариант - использовать blkid для получения уникального идентификатора каждого диска.
В 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.
Вот путь 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
Через мой любимый 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())
Пришел сюда поздно. Вот еще один подход 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]