从模式中删除行到下一个空行

从模式中删除行到下一个空行

我需要从模式中删除行到下一个空行。

例如:

pets:
- cat
- dog
- fish

fruits:
- apple
- banana
- orange

colors:
- red
- blue
- pink

我想删除从“fruit”(模式)到下一个空行的所有行,从而产生如下文件:

pets:
- cat
- dog
- fish

colors:
- red
- blue
- pink

非常感谢您的回答,但由于某种原因,它对我不起作用。

这是实际文件的示例:

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

2021  30  0 44  57.**** -23.****  -68.**** 149.****                                        
L02   2021  30  0 45  19.109
L02   2021  30  0 45  37.419
L04   2021  30  0 45  19.899
L04   2021  30  0 45  38.879

2021  30  1  6  32.7126 -23.45682  -68.65472 100.2616 
L01   2021  30  1  6  48.010
L01   2021  30  1  6  59.480*
L02   2021  30  1  6  47.970
L02   2021  30  1  6  59.380

我需要的:我需要删除表头中出现****的数据集,本例为删除:

2021  30  0 44  57.**** -23.****  -68.**** 149.****                                        
L02   2021  30  0 45  19.109
L02   2021  30  0 45  37.419
L04   2021  30  0 45  19.899
L04   2021  30  0 45  38.879

获取此数据作为最终文件:

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

2021  30  1  6  32.7126 -23.45682  -68.65472 100.2616 
L01   2021  30  1  6  48.010
L01   2021  30  1  6  59.480*
L02   2021  30  1  6  47.970
L02   2021  30  1  6  59.380

我做了什么:

sed '/\*\*\*/,/^$/d' filename.data

awk '/\*\*\*/,/^$/{next}1' filename.data

但删除模式后的所有内容,仅保留第一组,结果如下:

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

没有别的,剩下的都被删除了。

我希望我的问题能被理解。

关于 CSH 和 BASH,我知道它们是 shell,我的意思是我有我使用的命令,我必须能够在 CSH 中使用它。

提前致谢

答案1

cshbash是 shell,不适用于文本处理,但您可以像sed从这些 shell 中调用文本处理实用程序。使用sed,您可以删除两个模式之间的一系列行,如下所示:

sed '/^fruits:/,/^$/d' yourfile

说明: 模式^fruits:匹配以 开头的行fruits:,模式^$匹配空行(^是行首,$是行尾)。用平均值分隔这些模式,,以下命令将应用于该范围内的所有行,该命令是d(删除)。

答案2

如果这是一个 YAML 文件并且您想要删除该fruits部分,最好使用支持 YAML 的工具,yq例如https://kislyuk.github.io/yq/:

$ yq -y 'del(.fruits)' file
pets:
  - cat
  - dog
  - fish
colors:
  - red
  - blue
  - pink

答案3

awk '/^fruits/,/^$/{next}1' infile

默认打印,但跳过从匹配模式开始的所有内容fruits在行的开头直到第一个空行。

答案4

使用awk

awk '{arr[NR]=$0}/fruits/,/^$/ { if (/fruits/) line1=NR; if (/^$/) line2=NR}END{for(j=line1;j<=line2;j++) delete arr[j] ; for (i in arr) print arr[i]}' file

 pets:
 - cat
 - dog
 - fish

 colors:
 - red
 - blue
 - pink

arr在主块中,首先创建一个按记录号索引的数组。

然后使用这个表达式if (/fruit/) line1=NR;,找到与第一个模式匹配的行。同样,找到下一个空行。现在arr这些记录之间的数组元素以及arr包含这些记录的元素都被删除。

END块中,for 循环打印剩余的行。

相关内容