Вот вы:
sed 's/[^A-Za-z]\+/\n/g;s/$/\n/;s/[^\n]*[A-Z][^\n]*\n//g;s/\n$//' <input_file | sort -u
Ваша команда:
sed "/import:/a\$IMPORTED" infile
Вставляет буквальный $IMPORTED
текст в linux и GNU sed. Проблема в том, что оболочка интерпретирует обратную косую черту перед $
. Вы можете либо правильно процитировать:
sed '/import:/a\'"$IMPORTED" infile
Или разделите значение в отдельной части скрипта:
sed -e '/import:/a\' -e "$IMPORTED" infile
Всегда лучше заключать скрипты sed в одинарные кавычки.
Чтобы заменить значение old
значением new
, которое может содержать неопределенное количество строк, необходимо
Сначала :захватить все строки в пространстве шаблонов:
sed 'H;1h;$!d;x' файл
Установите значения для изменения:
старый='оригинал' новое='новое значение'
Удалить старое значение (, которое должно существовать):
sed -E -e 'H;1h;$!d;x' -e 's/ (import :)(\n )'"$old"'/\ профиль 1/г
Добавить новый вход:
sed -E -e 'H;1h;$!d;x' -e 's/ (import :)(\n )'"$old"'/\ 1/g' -e 's/ (import :)/\1\n'"$new"'/g' infile
Проблема заключается в том, что если переменная $old
содержит нулевое значение (пустое ), новая строка будет удалена. Чтобы решить это, нам нужно:
sed -E -e 'H;1h;$!d;x' -e 's/(import:)'"${old:+"(\\n)$old"}"'/\1/g' -e 's/(import:)/\1\n'"$new"'/g' infile