как копировать персонажа с помощью регулярных выражений / sed - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть скрипт, который выравнивает текст с четырьмя пробелами:

echo ${SOMETHING} | sed 's/^/ /g'

Моя IDE жалуется, что я использую четыре последовательных пробела в регулярном выражении.

Есть ли способ переписать это, чтобы сказать sed, "[space] * 4"?

1 Ответ

0 голосов
/ 13 сентября 2018

Это может быть более простой проблемой при цитировании. (Я не могу говорить с вашей «IDE», потому что думаю, что это не связано.)

У вас есть echo ${SOMETHING}. Это должно быть echo "${SOMETHING}", иначе оболочка интерпретирует строку и определенный интервал в раскрытии будет потерян. (Кроме того, вам следует избегать использования CAPS для переменных Bash. Они по соглашению зарезервированы для использования Bash.)

Пример:

$ something="123
> 456
> 789"

Теперь с кавычками:

$ echo "$something" 
123
456
789

Без:

$ echo $something
123 456 789

Теперь sed для отступа этих строк работает как ожидалось:

$ echo "$something" | sed 's/^/   /'
   123
   456
   789

Кроме того, заменяющий текст - это простая строка (кроме интерпретации для групп захвата или определенных расширений обратной косой черты в стиле C.) Так что выполнение чего-то вроде s/^/ {4}/ не работает. Вы также должны понимать, что sed ориентирован на строки (кроме операций логического диапазона), поэтому g в s/^/ /g ничего не делает. В каждой строке будет только одна замена. (Используйте Perl для многострочных замен.)

Чтобы получить определенный отступ, теперь используйте интерпретацию строки Bash в свою пользу:

$ indent=$'\t=>\t'
$ echo "$something" | sed "s/^/$indent/"
    =>  123
    =>  456
    =>  789

$'\t=>\t' - это цитирование ANSI C, которое поддерживает различные определения C с обратной косой чертой . Вам нужно изменить сценарий sed на ", чтобы значение в $indent интерпретировалось Bash, а затем добавлялось в сценарий sed. (Примечание: POSIX sed не поддерживает \n в шаблоне замены. GNU sed поддерживает.)

Наконец, вы можете использовать seq или printf, чтобы получить репликацию символа (т. Е. [space]*6 для использования в sed:

$ indent=$(seq -f " " -s '' 6)
$ echo "$something" | sed "s/^/$indent/"
      123
      456
      789

Или,

$ indent=$(printf "%6s")
$ echo "$something" | sed "s/^/$indent/"
      123
      456
      789
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...