Нельзя использовать ioctl() для управления устройством, принадлежащим модулю ядра?

С sedвам понадобится цикл, например:

sed -e :1 -e 's/^\( *\) /\1-/; t1' < file

Или сделайте что-то вроде:

sed '
s/ */&\
/; # add a newline after the leading spaces
h; # save a copy on the hold space
y/ /-/; # replace *every* space with -
G; # append our saved copy
s/\n.*\n//; # remove the superflous part' < file

С помощью perlвы можете делать такие вещи, как:

perl -pe 's{^ *}{$& =~ y/ /-/r}e' < file

или

perl -pe 's/(^|\G) /-/g' < file

\Gв PCRE соответствует (с нулевой -шириной )в конце предыдущего совпадения (в контексте //g). Итак, здесь мы заменяем пробел, который следует либо за началом строки ^, либо за концом предыдущего совпадения (, то есть ранее замененным пробелом ).

(можно также работать с sedреализациями, которые поддерживают PCRE, напримерssed -R).

С помощью awkвы можете сделать что-то вроде:

awk '
  match($0, /^ +/) {
    space = substr($0, 1, RLENGTH)
    gsub(" ", "-", space)
    $0 = space substr($0, RLENGTH+1)
  }
  {print}' < file

Если вы хотите также преобразовать вкладки (, где, например, <space><tab>fooбудет преобразовано в --------foo), вы можете предварительно обработать ввод с помощью expand. С помощью GNU expandвы можете сделать это expand -i, чтобы преобразовывались только табуляции среди начальных пробелов в строке. Вы можете указать расстояние между позициями табуляции -(каждые 8 ​​столбцов по умолчанию )с помощью опции -t.

Обобщить это на все символы горизонтального интервала или, по крайней мере, на те, которые входят в категорию [:blank:]в вашей локали, становится сложнее.

Если бы не символ TAB, это был бы просто вопрос:

perl -Mopen=locale -MText::CharWidth=mbswidth -pe 's/^\h+/"-" x mbswidth($&)/e'

Но символ TAB, являющийся управляющим символом, имеет ширину -1с этим mbswidth(), в то время как на самом деле он имеет переменную ширину от 1 до 8 столбцов в зависимости от того, где он находится на линии.

Команда expandрасширяет его до правильного количества пробелов, но некоторые реализации, в том числе GNU expand, не понимают это правильно, когда есть многобайтовые символы -(как и все пустые символы, кроме табуляции, пробел в UTF -8 локалей ),и даже некоторые из тех, которые поддерживают многобайтовые символы -, могут быть обмануты символами нулевой -ширины или символами двойной ширины -(, такими как U+3000, который находится в классе [:blank:]в типичных локалях GNU, по крайней мере ). Таким образом, нужно было бы выполнить расширение TAB вручную, например:

perl -Mopen=locale -MText::CharWidth=mbswidth -pe 's{^\h+}{
  $s = $&;
  while ($s =~ /(.*?)\t(.*)/) {
    $s = $1. (" " x ((7-mbswidth($1)) % 8 + 1)). $2;
  }
  "-" x mbswidth($s)}e'
1
08.08.2019, 05:43
1 ответ

Для всех, кого это касается :Основной причиной этого симптома является :Модуль ядра OV5645 отключит питание OV5645 (или сэкономит энергию -? )после его инициализации. После включения питания вручную теперь можно получить доступ к регистрам OV5645. БЮР.

0
28.01.2020, 00:04

Теги

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