Переместить несколько строк после совпадения с шаблоном в другую позицию (непосредственно перед другим совпадением) в оболочке.

Есть несколько вариантов драйверов Intel, которые, если они не работают должным образом с вашим оборудованием, могут вызвать такие проблемы:

  • Самый большой из них - lvds_downclock , но по умолчанию выключено. Если вы изменили это значение по умолчанию, попробуйте это в первую очередь. (Возможно, некоторые версии ядра включены по умолчанию, поэтому стоит попробовать отключить его принудительно).
  • i915_enable_fbc может вызывать различные проблемы с отображением. По умолчанию используется для каждого чипа, вы можете попробовать выключить его.

И то, и другое, вероятно, немного увеличит потребление энергии.

  • Наконец, для параметра powersave по умолчанию установлено значение true, его выключение отключит сразу несколько функций энергосбережения. Это, вероятно, сработает, но вы заметите, что время автономной работы снизилось.

Есть два способа установить эти значения:

  1. В командной строке ядра, например: i915.i915_enable_fbc = 0 . Да, вам нужен i915. , даже если имя опции начинается с i915. Вы можете временно протестировать, отредактировав командную строку в GRUB перед загрузкой и навсегда установив в конфигурации grub (отредактируйте / etc / default / grub , затем запустите update-grub . Или dpkg-reconfigure grub-pc ).
  2. Создайте новый файл в /etc/modprobe.d , например /etc/modprobe.d/local-i915.conf . Затем внутри него поместите options i915 i915_enable_fbc = 0 lvds_downclock = 0 (и т. Д.). Обратите внимание, что вы не используете i915. Здесь префикс . После редактирования запустите update-initramfs -u .

Другой вариант - попробовать более новое ядро. В настоящее время Debian Backports имеет версию 3.12. В новых ядрах исправлено множество ошибок в видеодрайвере Intel, а также улучшено понимание того, на каком оборудовании работают определенные функции энергосбережения.

0
24.02.2019, 05:22
4 ответа

Python (одиночное чтение)

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

#!/usr/bin/env python3
import sys

flag=False
vals = []
with open(sys.argv[1]) as fd:
    for line in fd: 
        if line.strip() == "DDD" or flag:
            # encountered line where we should stop appending values
            if line.strip() == "ABAB": 
                flag = False
                # print the line and two others, then move in what was between originally
                print(line.strip())
                for i in range(2):
                    print(fd.readline().strip())
                print("\n".join(vals))
                continue
            # store values while we haven't hit ABAB
            flag = True
            vals.append(line.strip())
            continue

        print(line.strip())

Python (двойное чтение)

Re -с использованием оригинальной идеи awk Мне пришлось прочитать файл дважды, мы можем сделать то же самое в Python:

#!/usr/bin/env python3
import sys


flag_pos,match = 0,0
vals = []
with open(sys.argv[1]) as fd:
     for index, line in enumerate(fd):
         if line.strip() == "DDD":
             flag_pos = index
         if line.strip() == "ABAB":
             vals.append(line.strip())
             fd.readline()
             vals.append(fd.readline().strip())


with open(sys.argv[1]) as fd:
    for index,line in enumerate(fd):
        if index == flag_pos:
            print("\n\n".join(vals),"\n")
        if line.strip() in vals:
            fd.readline()
            continue
        print(line.strip()) 

Этот скрипт можно сохранить как movelines.pyи вызвать как./movelines.py input.txt

АВК

Это выполнимо в gawk, вероятно, гораздо проще, чемsed:

$ awk 'NR==FNR && $0=="ABAB" { a[i++]=$0;getline;getline; a[i++]=$0; }; NR!=FNR { if($0=="DDD") for(val in a) printf "%s\n\n",a[val];  if($0 == "ABAB") {getline;getline;getline;} print $0   }' input.txt input.txt
AAA

BBB

CCC

ABAB

ACAC

DDD

EEE

FFF


GGG

HHH

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

Если в вашем реальном файле нет пустых строк, как в приведенном вами примере, вам просто нужна одна getlineвместо двух, и "%s\n"во второй части кода будет достаточно.

Для удобства чтения приведена многострочная версия кода с комментариями:

# on first reading NR != FNR, 
# so lets store ABAB and the other line into array
awk 'NR==FNR && $0=="ABAB" { 
        # i variable will be initialized once incremented first time
        a[i++]=$0;getline;getline; a[i++]=$0; 
    };
    # Here we are reading the same file second time 
    NR!=FNR { 

        if($0=="DDD") 
            for(val in a) 
                printf "%s\n\n",a[val]; 
        # Skip what we matched already
        if ($0 == "ABAB"){
            getline;
            getline;
            getline;
        }
        print $0   
     }' input.txt input.txt
0
28.01.2020, 02:22

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

sed -e '
    /DDD/,/ABAB/! b
    H;/ABAB/!{$!d;};g
    s/\(\n.*\)\n\(.*\)/\2\1/
' input.txt

Это упрощается с помощью edредактора:

 ed -s input.file -  <<\eof
 /ABAB/m?DDD?-
 wq
 eof
1
28.01.2020, 02:22

ПРИМЕЧАНИЕ. :Я предполагаю, что ваши данные , а не содержат пустые строки между каждой записью; если это так, вам нужно будет адресовать четыре строки, т.е. изменить +на+3

С GNUed:

$ ed -s file <<EOF
/ABAB/,//+m?DDD?-
,p
q
EOF

где

  • /ABAB/,//+обращается к диапазону строк от /ABAB/до предыдущего совпадения //плюс одна строка
  • mперемещает адресуемые строки в
  • ?DDD?-предыдущая строка соответствует DDD, минус одна строка
  • ,pраспечатать весь буфер

В виде одного -вкладыша,

printf '/ABAB/,//+m?DDD?-\n,p\nq\n' | ed -s file

Чтобы отредактировать fileна месте, замените ,p\nq\nна,wq\n(w rite и q uit ).

2
28.01.2020, 02:22

Я сделал следующим способом

команда

Step1: h=`sed -n '/[A-Za-z]\{4\}/p' filename| sed -n '1p'`
step2:m=`sed -n '/[A-Za-z]\{4\}/p' filename| sed -n '2p'`
step3

    sed '/[A-Z]\{4\}/d' filename|sed "/CCC/s/.*/&\n\n$h\n\n$m/g"| sed '/^$/d' 

выход

AAA
BBB
CCC
ABAB
ACAC
DDD
EEE
FFF
GGG
HHH
0
28.01.2020, 02:22

Теги

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