Вставьте новый текст в середине файла, заменяющего старый текст без повторного вставки одних и то же вещей и снова?

Вот вы:

sed 's/[^A-Za-z]\+/\n/g;s/$/\n/;s/[^\n]*[A-Z][^\n]*\n//g;s/\n$//' <input_file | sort -u
0
29.11.2018, 03:31
1 ответ

Ваша команда:

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
0
28.01.2020, 04:07

Теги

Похожие вопросы