Как воспроизвести символ с помощью регулярного выражения / sed

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

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

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

Есть ли способ переписать это, чтобы сообщить sed «[пробел] * 4»?

Ваша IDE жалуется на отступы ?!

revo 13.09.2018 17:31

В sed нет оператора повторения строк ... вы можете использовать perl, но вопрос не ясен ... как IDE входит в картину с sed?

Sundeep 13.09.2018 17:42
sed 's/^/ /;s/^/ /;s/^/ /;s/^/ /'?
Cyrus 13.09.2018 17:42

Если ваша IDE жалуется на "пробелы в регулярном выражении", это неправильно, потому что пробелы не в регулярном выражении, это строка замены, в которой синтаксис регулярного выражения не имеет смысла.

Benjamin W. 13.09.2018 17:53

Какую среду IDE вы используете?

Adam 13.09.2018 17:55

Это проблема вашей IDE. То, что вы делаете, совершенно нормально.

Andy Lester 13.09.2018 18:05

IDE - это RubyMine. Интересно, что PyCharm не жалуется. Конечно, это может быть проблема IDE / плагина с интерпретацией синтаксиса. Он подчеркивает, что утверждение требует рефакторинга, а не как ошибку. (Точно так же он лает о преобразовании $ VAR в $ {VAR}.) Спасибо всем за комментарии.

James 13.09.2018 21:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
100
1

Ответы 1

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

Другие вопросы по теме