从文件中删除内容或使用新文件进行更新

Grep and delete content from a file or update with new file

提问人:user8845141 提问时间:9/12/2023 最后编辑:Jensuser8845141 更新时间:10/29/2023 访问量:70

问:

我需要使用唯一关键字 grep 数据并删除下面两行的上行。

例如:

源文件:

{
  name: main
  phase: beta
}
{
  name: test
  phase: dev
}

我使用以下命令来 grep 数据:

grep -A2 -B1 main sourcefile

这给了我:

{
  name: main
  phase: beta
}

我使用过-v选项,但没有运气......它仍然显示整个数据。

grep -vA2 -vB1 main sourcefile

然后我用 grep 打印行号,并尝试用 sed 删除相同的行号,但这也不起作用。

for i in `grep -n -A2 -B1 main sourcefile | awk {'print $1'} | cut -b 1,2` do sed -e "$i"d sourcefile; done.

任何帮助将不胜感激。

尝试从具有 grep 唯一关键字的文件中删除数据并更新文件

Linux SED grep

评论

0赞 anubhava 9/12/2023
您的预期产出是多少?
0赞 user8845141 9/12/2023
源文件应保留为: { name: test phase: dev }
0赞 anubhava 9/12/2023
建议您编辑您的问题,并在问题本身中显示此预期输出。
0赞 knittl 9/12/2023
输入看起来像“几乎是 JSON”。是否可以将输入更改为有效的 JSON(或至少是一系列 JSON 实体)?

答:

0赞 anubhava 9/12/2023 #1

您可以使用以下解决方案:gnu-awk

awk -v RS='{[^}]*}\n' '{ORS = (RT ~ /:\s*main/ ? "" : RT)} 1' file

{
  name: test
  phase: dev
}

这里:

  • RS='{[^}]*}\n'将文本设置为记录分隔符。{...}\n
  • ORS = (RT ~ /:\s*main/ ? "" : RT)当我们在 else 中发现时,将设置为空字符串。ORS: mainRTORSRT
0赞 potong 9/12/2023 #2

这可能对你有用(GNU sed):

sed 'N;/\n.*\bmain\b/{N;N;d};P;D' file

打开一个两行窗口,如果第二行包含单词,则附加接下来的两行,然后删除模式空间中的四行。main

如果第二行不包含单词,请打印/删除第一行并重复。main

0赞 Ed Morton 9/13/2023 #3

使用任何 awk:

$ awk '{rec=rec $0 ORS} /^}$/{if (rec !~ /main/) printf "%s", rec; rec=""}' file
{
  name: test
  phase: dev
}

即使您的数据包含 或在其他上下文中,例如在字符串内部,并且无论每个终止的块中有多少行,上述方法都将起作用。它假设您对子字符串匹配没问题(例如 或者),就像你问题中的命令一样 - 如果这是错误的,那么只需收紧正则表达式以使其更具排他性,例如 .{}}mainmainstaygermaingrep/name: *main\n/

0赞 jhnc 10/29/2023 #4

ed可以很容易地进行这样的相对更改:

printf '/main/-1;+3d\nw\nq\n' | ed -s sourcefile

ed -s sourcefile <<'EOD'
/main/-1;+3d
w
q
EOD
  • 找到匹配正则表达式的线并移动到其上方的线
  • 删除该行和接下来的 3 行
  • 保存更改
  • 退出