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