如何删除前缀和后缀之间的内容

如何删除前缀和后缀之间的内容

我只想删除前缀和后缀之间的内容(多行)。我的前缀和后缀不应该被删除。

我尝试了这个,但它删除了我的前缀和后缀:

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 = ,

答案1

一种可能的方法是通过 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

答案2

尝试使用以下命令并且工作正常

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 = ,

答案3

要编辑文件中的行,您可以将命令发送到ed

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

这将发送三个换行符分隔的命令ed(我们指示其启动并使用-s选项静默处理 myfile.txt):

  • /^prefix =/+1,/^suffix =/-1d-- 删除以下范围内的行:“与prefix =行首匹配的行之后的一行”到“与suffix =行开头匹配的行之前的一行”
  • 1,$s/^prefix = .*/prefix =/-- 搜索和替换:在文件的每一行中,对于prefix =行首后面跟有任何内容(或没有任何内容)的模式,仅将其替换为文本prefix =
  • wq--w将文件写回磁盘并q退出ed

这对您的文件和您想要的翻译做出一些假设:

  • prefixthe和后缀之间至少有一行`
  • 你想要prefix =去掉所有的尾随文本
  • 只有一个“节”prefixsuffix需要更新

答案4

您可以根据您的要求尝试一下:

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

相关内容