Ошибка Sed Неопределенный шаблон подстановки для текста новой строки - PullRequest
0 голосов
/ 11 сентября 2018

Я пишу скрипт для добавления новых зависимостей в список наблюдения.Я помещаю местозаполнитель, чтобы знать, куда добавить текст, например,

assets = [
  "../../new_app/assets"
  # [[NEW_APP_ADD_ASSETS]]
]

Просто заменить местозаполнитель, но моя проблема - добавить запятую в предыдущей строке.

это можно сделать, если я найду и заменит

"
# [[NEW_APP_ADD_ASSETS]]

т.е. "\n # [[NEW_APP_ADD_ASSETS]]

Я не могу найти новую строку.

Одно из решенийЯ обнаружил, что для добавления новой строки было

sed -i '' 's/newline/line one\
line two/' filename.txt

Но когда для строки поиска выполняется то же самое, возвращается :unterminated substitute pattern

sed -i '' s/'assets\"\
   #'/'some new text'/ filename.txt

PS: я пишу на macos

1 Ответ

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

Sed работает построчно, поэтому сложно добавить кому к предыдущей строке, так как эта строка уже обработана.Это возможно, но синтаксис sed быстро становится беспорядочным.

Чтобы быть более конкретным:

В операции по умолчанию sed циклически добавляет строкуввод, за исключением его завершающего символа , в пространство шаблона .Чтение из входных данных должно быть пропущено, если было в пространстве шаблона до команды D, заканчивающей предыдущий цикл.Затем утилита sed последовательно применяет все команды, адреса которых выбирают это пространство шаблона, до тех пор, пока команда не начнет следующий цикл или не завершит работу.Если ни одна команда явно не начала новый цикл, то в конце скрипта пространство шаблона должно быть скопировано в стандартный вывод (кроме случаев, когда указано -n) , и пространство шаблона должно быть удалено.Всякий раз, когда пространство шаблона записывается в стандартный выходной файл или именованный файл, sed сразу же следует за ним с .

Короче говоря, если вы не манипулируете пространством шаблона , вы не можете обрабатывать символов, так как они просто не появляются!

И даже короче, если вы используете только команду замены, sed обрабатывает только одну строку за раз!

ThisТакже вы страдаете от : unterminated substitute pattern.Вы ищете символ новой строки, но поскольку sed просто читает по одной строке за раз, он просто не находит его и также не ожидает его.Ошибка исчезнет, ​​если вы замените символ новой строки символами \n.

sed -i '' s/'assets\"\n   #'/'some new text'/ filename.txt

. Лучшим способом достижения ваших целей будет использование awk.Это немного более читабельно:

awk '/# [[NEW_APP_ADD_ASSETS]]/{ print t","; t="line1\nline2"; next }
     { print t; t=$0 }
     END{ print t }' <file>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...