У меня есть скрипт, который делает отступ для текста четырьмя пробелами:
echo ${SOMETHING} | sed 's/^/ /g'
Моя IDE жалуется, что я использую четыре последовательных пробела в регулярном выражении.
Есть ли способ переписать это, чтобы сообщить sed «[пробел] * 4»?
В sed нет оператора повторения строк ... вы можете использовать perl, но вопрос не ясен ... как IDE входит в картину с sed?
sed 's/^/ /;s/^/ /;s/^/ /;s/^/ /'
?
Если ваша IDE жалуется на "пробелы в регулярном выражении", это неправильно, потому что пробелы не в регулярном выражении, это строка замены, в которой синтаксис регулярного выражения не имеет смысла.
Какую среду IDE вы используете?
Это проблема вашей IDE. То, что вы делаете, совершенно нормально.
IDE - это RubyMine. Интересно, что PyCharm не жалуется. Конечно, это может быть проблема IDE / плагина с интерпретацией синтаксиса. Он подчеркивает, что утверждение требует рефакторинга, а не как ошибку. (Точно так же он лает о преобразовании $ VAR в $ {VAR}.) Спасибо всем за комментарии.
Это может быть более серьезная проблема с цитированием. (Я не могу говорить с вашей «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
Ваша IDE жалуется на отступы ?!