提问人:user8845141 提问时间:9/12/2023 最后编辑:Jensuser8845141 更新时间:10/29/2023 访问量:70
从文件中删除内容或使用新文件进行更新
Grep and delete content from a file or update with new file
问:
我需要使用唯一关键字 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 唯一关键字的文件中删除数据并更新文件
答:
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
: main
RT
ORS
RT
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
}
即使您的数据包含 或在其他上下文中,例如在字符串内部,并且无论每个终止的块中有多少行,上述方法都将起作用。它假设您对子字符串匹配没问题(例如 或者),就像你问题中的命令一样 - 如果这是错误的,那么只需收紧正则表达式以使其更具排他性,例如 .{
}
}
main
mainstay
germain
grep
/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 行
- 保存更改
- 退出
评论