在sed下面删除了{content-start}和{content-end}之间出现的所有块,但是只想删除第1个和第3个块而不是第2个块。
sed -ie '/{content-start.*}/,/{content-end}/d' test.txt
的test.txt:
{content-start}
abc1
def1
ghi1
{content-end}
{content-start}
abc2
def2
ghi2
{content-end}
{content-start}
abc3
def3
ghi3
{content-end}
答案 0 :(得分:0)
关注awk
可能会对您有所帮助。
awk '
/^{content-start}/{
flag=1;
count++}
flag && count!=1 && count!=3;
/^{content-end}/{
flag=""}
' Input_file
根据您的示例,Input_file将是输出。
{content-start}
abc2
def2
ghi2
{content-end}
答案 1 :(得分:0)
这可能适合你(GNU sed):
sed -n '/{content-start}/{x;s/^/x/;x;:a;N;/{content-end}/!ba;x;/^x\{2\}$/{x;p;x};x}' file
使用-n
选项复制seds grep-like-nature。收集开始和结束标记之间的线。在集合开始时,向保留空间附加一个标志以用作计数器。收集了所有必需的行后,仅在保留空间包含所需数字时打印。
此解决方案仅打印第二个块,但是如果您只想排除块1和块3,则:
sed '/{content-start}/{x;s/^/x/;x;:a;N;/{content-end}/!ba;x;/^x\{1\}$/{x;d};/^x\{3\}/{x;d};x}' file
此解决方案仅删除块1和3。
答案 2 :(得分:0)
sed用于单个行的简单替换,即s / old / new /,全部。对于其他任何你应该使用awk:
gzip
或者如果你想要对单个行做任何事情,那么将记录的每一行保存在一个数组中,而不是将整个记录保存为字符串:
tarfile
以上内容适用于任何UNIX系统上任何shell中的任何awk,如果/当您的需求发生变化,则可以轻松增强。