Это может быть более простой проблемой при цитировании. (Я не могу говорить с вашей «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