Я хочу удалить содержимое (несколько строк) только между моим префиксом и суффиксом. Мои префикс и суффикс не должны быть
Я попробовал это, но он удалил мой префикс и суффикс:
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 = ,
Один из возможных подходов — использование 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
Пробовал с помощью приведенной ниже команды и работал нормально
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 =,
Чтобы редактировать строки в файле, вы можете отправлять команды на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
подлежит обновлению Вы можете попробовать это для своих требований:
$ sed -ne '
/^\(prefix =\).*/,/^\(suffix =.*\)/!p
s//\1/p
' myfile.txt