Замените начальные пробелы на sed (или аналогичные) - PullRequest
3 голосов
/ 10 февраля 2012

Я хотел бы заменить начальные пробелы или символы табуляции в каждой строке файла аналогичным количеством других символов (для простоты будем использовать _).

Например,

foo bar
 foo bar
  line 3

становится

foo bar
_foo bar
__line 3

Обратите внимание, что не ведущий белый пробел не затронут, иначе это будет легко!Я подозреваю, что это все еще легко, но мне не хватает хитрости.

Ответы [ 5 ]

7 голосов
/ 10 февраля 2012

Это будет работать для вас:

sed ':a;s/^\([[:space:]]*\)[[:space:]]/\1_/;ta' file

Пример

$ sed ':a;s/^\([[:space:]]*\)[[:space:]]/\1_/;ta' <<<$'foo bar\n foo bar\n\t\tline 3\n _ x'
foo bar
_foo bar
__line 3
__ x
3 голосов
/ 10 февраля 2012

Вы в порядке с однострочником Perl?Вы можете написать:

perl -pe 's/^([ \t]+)/"_" x length $1/e'

(либо добавьте в файл файл при стандартном вводе, либо указав имя файла в конце команды).

Отредактировано, чтобы добавить: В приведенном выше комментарии Уильям Перселл спрашивает, хотите ли вы, чтобы «вкладка заменялась одним« _ », или достаточно для заполнения табуляции».Приведенная выше команда заменяет вкладку одним подчеркиванием.Если вы хотите заполнить табуляцию достаточно, самый простой подход - использовать утилиту expand, которая преобразует табуляции в пробелы перед передачей ввода в Perl:

expand -i | perl -pe 's/^([ \t]+)/"_" x length $1/e'

(либо в вашем файлепри стандартном вводе или указании имени файла в конце части expand, непосредственно перед символом |).

0 голосов
/ 07 июля 2012

@ Решение SiegeX не работает с системой sed в Mac OS X Lion. Вот один из обходных путей:

eval sed "$(for i in $(seq 40 -1 1); do
                  echo -n "-e 's/^$(for j in $(seq 1 $i);
                      do echo -n ' ';
                  done)/$(for j in $(seq 1 $i);
                      do echo -n '_';
                  done)/' "; done)"

, который динамически генерирует параметры

...
-e 's/^       /_______/g' \
-e 's/^      /______/g' \
-e 's/^     /_____/g' \
-e 's/^    /____/g' \
-e 's/^   /___/g' \
-e 's/^  /__/g' \
-e 's/^ /_/g'
0 голосов
/ 10 февраля 2012

Это может работать для вас:

sed '/^\s\+/!b;h;s///;x;s/\S.*//;s/./_/g;G;s/\n//' <<<$'foo bar\n foo bar\n\t\tline 3'
foo bar
_foo bar
__line 3

Чтобы развернуть начальные табуляции до пробелов, а затем до подчеркивания:

expand -i <<<$'foo bar\n foo bar\n\t\tline 3' |
sed '/^\s\+/!b;h;s///;x;s/\S.*//;s/./_/g;G;s/\n//'
foo bar
_foo bar
________________line 3
0 голосов
/ 10 февраля 2012

вы можете использовать это регулярное выражение для получения первых пробелов или символов табуляции

(^\s+)

но заменив его подчеркиванием, хорошо, что я не могу помочь, потому что у меня нет опыта в bash

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...