我需要从模式中删除行到下一个空行。
例如:
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
csh
和bash
是 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 循环打印剩余的行。