Как получить содержимое между двумя строками, используя одинаковое количество повторяющихся символов?

Чтобы изменить яркость экрана, вы можете использовать xrandr.

Для этого вы можете:

xrandr -q | grep ' connected' | head -n 1 | cut -d ' ' -f1

Это вернет все подключенные мониторы (, такие как LVDS-1или DVI-D-0, например ).

Теперь, чтобы изменить яркость экрана, введите команду (и замените DVI-D-0предыдущим выводом команды):

xrandr --output DVI-D-0 --brightness 0.7

Например, эта команда устанавливает яркость на 70%.

Надеюсь, это поможет!

2
08.05.2021, 11:05
4 ответа

Мы используем утилиту awk , чтобы применить логику триггера для переключения из состояния «включено» в состояние «выключено», как показано:

$ awk -v str="==" '
      $0""==str{f=!f;next};f
' testfile
Last test

Используя конструкции Posixly sed , мы можем реализовать логику триггера:

sed -ne '
  /^==$/{
    x;        # access state info from hold
    s/^$/0/;  # initialize state
    y/01/10/; # toggle state
    x;        # save state in hold
    d;        # next
  }
  G;/\n1/P
' testfile

Использование GNU-версии потокового редактора sed в расширенном режиме-E

$ sed -Ee '
    $!N; /^(\S)\1+\n/!D
    :loop
        $d;N
        s/^(.*)\n(.*)\n\1$/\2/;t
    bloop
' testfile
This is a test
Another test
Last test

Примечания:-

  • Сохраняйте двухстрочный -пробел шаблона с помощью команды N.
  • продолжать отбрасывать строки до тех пор, пока мы не встретим золотую линию (=> такую, в которой первая часть пространства шаблонов содержит только один тип символов без пробелов)
  • Как только такая линия найдена, мы зацикливаемся до тех пор, пока не встретим ее точную копию по крайней мере через две строки по дороге. И мы закончили с поиском первого набора.
  • Этот процесс повторяется до тех пор, пока мы не достигнем eof.

Используя оператор флип -флоп ...в perl мы можем сделать как показано:

perl -lne 'print if 
 /^(\S)\1+$(?{$a=$_})/... $_ eq $a and $_ ne $a;
' testfile

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

$ perl -nlse 'print if
    $_ eq $a... $_ eq $a and $_ ne $a;
' -- -a=== testfile

$ sed -Ee '
    /^==$/!d
    $!N
    :a
        $d;N
        s/^(.*)\n(.*)\n\1$/\2/;t
    ba
' testfile
8
28.07.2021, 11:34

Я бы использовалperl:

$ perl -0777 -ne 'print $3 while /^((\S)\2+\n)(.*?)^\1/smg' < your-file
This is a test
Another test
Last test

илиpcregrep:

$ pcregrep -Mo3 '(?s)^((\S)\2+\n)(.*?)\n?^\1' < your-file
This is a test
Another test
Last test

Если речь идет только о возврате того, что находится между фиксированными разделителями:

$ pcregrep -Mo1 '(?s)^==\n(.*?)\n?^==$' < your-file
Last test
4
28.07.2021, 11:34

команда:

awk '{a[++i]=$0}/==/{for(x=NR-1;x<NR;x++)print a[x]}' filename|sed '/^$/d'

выход

This is a test
Another test
Last test
2
28.07.2021, 11:34

Похоже, ваш вопрос не был понятен, и вы получили различные варианты решения. Чтобы получить только содержимое, окруженное ==с синтаксисом/функцией GNU sed(, может отличаться от других реализаций ):

.
$ sed -n '/^==$/,//{//!p}' testfile
Last test
В

sedесть способ выбрать диапазон строк, указав два адреса , разделенные запятой. Чтобы избежать повторения регулярного выражения, вы можете использовать здесь //. Поскольку вы не хотите, чтобы сами строки маркеров выводились, вы можете отменить эти совпадения. {}используется для группировки команд, которые должны выполняться только для совпадающих строк.

3
28.07.2021, 11:34

Теги

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