С помощью sed это можно сделать следующим образом. Поместите два маркера в начале двух линий, предварительно переместив их в пространство шаблона.
Затем начните перемещать их вправо по символу за раз. Во время этого движения обратите внимание на то, что находится справа от маркеров, и примите соответствующие меры.
Остановиться, когда маркер достигнет конца пространства шаблона. Теперь уберите маркеры, так как их работа сделана, и останется то, что вам нужно. Обратите внимание на маркер \n
sed -Ee '
/#/N;/\n/!b
s/\n/&&/;s/^/\n/
:a
/\n#(.*\n.*\n)./{
s//\n\1/;ba
}
s/\n(.)(.*\n.*)\n(.)/\1\n\2\3\n/
/\n$/!ba
s/\n//;s///2
' input
Использование Perl решается следующим образом:
perl -pe '
next unless /#/;
my($n,$p) = (scalar <>);
while ( /#/g ) {
pos($n) = pos() - 1 - $p++;
$n =~ s/\G.//;
}
y/#//d;s/\z/$n/;
' input_file
Рабочий:
1. Skip lines that donot have hash char.
2. Save the next line in $n and init. $p counter which keeps track of the number of hash chars erased till now.
3. Monitor the position of the hash char in a while loop and using info generate the position of the char to be deleted in next line.
4. Erase it using the \G metachar in s///
5. In the final step remove the hash chars from present line and append the next line to it.
Показан другой метод, на этот раз использующий массивы:
perl -aF'' -ne '
print,next unless /#/;
print,last if eof;
my @I = grep { $F[$_] ne "#" } 0.. $#F;
my @N = split //, <>;
print @F[@I], @N[@I];
' input_file
Рабочий:
1. Invoke Perl to split each line on a per character basis and have it stored in the array @F anew for every line read.
2. Record the array indices for which the array element is a non hash character.
3. Readin the next line, split it on a per character basis and store in array @N.
4. Now its a matter of selecting the indices we stored in @I and fetch those from arrays @F and @N.
Метод регулярных выражений:
perl -pe '
$_.= <> unless eof;
s/\G.(.*\n.{@{[+pos]}})./$1/ while /(?=#.*\n.)/g;
' input_file
Описание:
° добавить следующую строку к текущей, если это не последняя строка.
° Запишите позиции символов решетки в первой строке с помощью цикла while.
° Затем удалите символ решетки в исходной строке и символ в соответствующей позиции в следующей строке.
° После выхода из цикла while опция -p автоматически выведет $ _на стандартный вывод.
Метод с простыми строковыми операциями:
perl -pe '
last if eof;
my $n = <>;
while ( (my $p = index($_,"#")) > -1 ) {
substr($_, $p, 1) = "" for $_, $n;
}
$_.= $n;
' input_file
Это включает в себя использование встроенного индекса для проверки позиции хэша, а затем его использование во встроенной подстроке два раза... в первой и следующей строках.
Да, это снизит производительность. Но ничто другое не должно ломаться, пока вы не вводите но.
Но зачем это делать. Нет никакой выгоды. Ядро пытается найти применение неиспользуемой памяти.
Мой совет: не надо !
Если у вас нет особой потребности в памяти сейчас , лучше иметь память для хранения потенциально полезных вещей. Ядро Linux сможет восстановить память менее чем за микросекунду, если она ему действительно понадобится. Напротив, для получения данных с традиционных жестких дисков потребуются десятки тысяч микросекунд (. Жесткому диску со скоростью вращения 7200 об/мин требуется в среднем 4,2 миллисекунды, чтобы диск повернулся в нужное место, а время поиска на более мощных дисках также составляет 4. миллисекунд ), если окажется, что вам это нужно. Даже производительность ssd будет ниже по сравнению с оперативной памятью
Нет экономии энергии, связанной с отсутствием полезной информации в памяти.
Причины удаления кешей в основном связаны с эталонными тестами, особенно с тестовыми -системами маркировки файлов -. Можно представить себе инструмент гибернации, также желающий уменьшить объем основной памяти, необходимой для записи.