Как удалить содержимое между префиксом и суффиксом

Я хочу удалить содержимое (несколько строк) только между моим префиксом и суффиксом. Мои префикс и суффикс не должны быть

Я попробовал это, но он удалил мой префикс и суффикс:

sed -i "/prefix =/,/suffix =/d" myfile.txt

Содержание:

prefix = Content that i want to delete.
That includes multiple lines as
well as ASCII characters.
suffix = ,

Вывод:

prefix = 
suffix = ,
0
10.06.2019, 13:13
4 ответа

Один из возможных подходов — использование awk и =в качестве разделителя полей:

$ awk -F'=' 'BEGIN{OFS="=";};/^prefix/{$2=""; print; noprint=1};/^suffix/{noprint=0;print};noprint{next;};' input.txt
prefix =
suffix =,

Если есть другой контент до и после суффикса, который мы хотим получить, можно использовать тот же подход с небольшой модификацией

$ awk -F'=' '/^prefix/{$2=""; printf "%s%s\n",$1,FS; noprint=1};/^suffix/||!noprint{noprint=0;print};noprint{next;};' input.txt
things beforeprefix
prefix =
suffix =,
things after suffix

Это, конечно, можно сократить:

$ awk 'BEGIN{FS=OFS="=";};/^prefix/{p=1;$2="";print};/^suffix/{p=0};!p' input.txt
things beforeprefix
prefix =
suffix =,
things after suffix
0
28.01.2020, 03:36

Пробовал с помощью приведенной ниже команды и работал нормально

sed -n '/prefix/,/suffix/p' file.txt| awk '/prefix/||/suffix/{print $0}'| sed '/prefix = /s/=.*/=/g' >file_tmp.txt && mv file_tmp.txt file.txt

выход

prefix =
suffix =,
0
28.01.2020, 03:36

Чтобы редактировать строки в файле, вы можете отправлять команды наed:

printf '%s\n' '/^prefix =/+1,/^suffix =/-1d' '1,$s/^prefix =.*/prefix =/' 'wq' |ed -s myfile.txt

Это отправляет три команды, разделенные новой строкой -, ed(, которым мы даем указание запускать и работать в режиме без вывода сообщений с myfile.txt с параметром -s):

  • /^prefix =/+1,/^suffix =/-1d--удалить строки в диапазоне от :«одна после строки, которая соответствует prefix =в начале строки» до «одна перед строкой, которая соответствует suffix =в начале строки»
  • 1,$s/^prefix =.*/prefix =/--найдите и замените :в каждой строке файла, для шаблона prefix =, за которым следует что-либо (или ничего )в начале строки, замените его только текстомprefix =
  • wq--wзаписать файл обратно на диск и qудалитьed

Это делает некоторые предположения о вашем файле и переводах, которые вы хотите:

  • есть хотя бы одна строка между prefixи суффиксом`
  • вы хотите, чтобы каждый prefix =был лишен завершающего текста
  • только одна "строфа" из prefixи suffixподлежит обновлению
0
28.01.2020, 03:36

Вы можете попробовать это для своих требований:

$ sed -ne '
   /^\(prefix =\).*/,/^\(suffix =.*\)/!p
   s//\1/p
' myfile.txt
0
28.01.2020, 03:36

Теги

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