gpt4 book ai didi

shell - 在 bash 中删除匹配之前和之后的行(使用 sed 或 awk)?

转载 作者:行者123 更新时间:2023-12-04 10:27:29 24 4
gpt4 key购买 nike

我试图从一个充满交易的文件中删除模式匹配两侧的两行。 IE。找到匹配然后删除它之前的两行,然后删除它之后的两行,然后删除匹配。将其写回原始文件。

所以输入数据是

D28/10/2011
T-3.48
PINITIAL BALANCE
M
^

我的模式是
sed -i '/PINITIAL BALANCE/,+2d' test.txt

然而,这只是在模式匹配后删除两行,然后删除模式匹配。我无法找到任何逻辑方法来使用 sed 从原始文件中删除所有 5 行数据。

最佳答案

awk one-liner 可以完成这项工作:

awk '/PINITIAL BALANCE/{for(x=NR-2;x<=NR+2;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file

测试:
kent$  cat file
######
foo
D28/10/2011
T-3.48
PINITIAL BALANCE
M
x
bar
######
this line will be kept
here
comes
PINITIAL BALANCE
again
blah
this line will be kept too
########

kent$ awk '/PINITIAL BALANCE/{for(x=NR-2;x<=NR+2;x++)d[x];}{a[NR]=$0}END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' file
######
foo
bar
######
this line will be kept
this line will be kept too
########

添加一些解释
  awk '/PINITIAL BALANCE/{for(x=NR-2;x<=NR+2;x++)d[x];}   #if match found, add the line and +- 2 lines' line number in an array "d"
{a[NR]=$0} # save all lines in an array with line number as index
END{for(i=1;i<=NR;i++)if(!(i in d))print a[i]}' #finally print only those index not in array "d"
file # your input file

关于shell - 在 bash 中删除匹配之前和之后的行(使用 sed 或 awk)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11793942/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com