![如何删除前缀和后缀之间的内容](https://linux22.com/image/155153/%E5%A6%82%E4%BD%95%E5%88%A0%E9%99%A4%E5%89%8D%E7%BC%80%E5%92%8C%E5%90%8E%E7%BC%80%E4%B9%8B%E9%97%B4%E7%9A%84%E5%86%85%E5%AE%B9.png)
我只想删除前缀和后缀之间的内容(多行)。我的前缀和后缀不应该被删除。
我尝试了这个,但它删除了我的前缀和后缀:
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
这对您的文件和您想要的翻译做出一些假设:
prefix
the和后缀之间至少有一行`- 你想要
prefix =
去掉所有的尾随文本 - 只有一个“节”
prefix
和suffix
需要更新
答案4
您可以根据您的要求尝试一下:
$ sed -ne '
/^\(prefix =\).*/,/^\(suffix =.*\)/!p
s//\1/p
' myfile.txt