regex - 逐行替换,如果不存在则创建新的 - sed
问题描述
如果某个块中不存在,我想替换 'DUMP=' 行或添加新行。当块定义由 from[text]
直到 next[text]
时,例如:
[name]
sometext=...
moretext=...
DUMP=
moretext2=...
[name2]
...
为了替换现有的线路,我会这样做:
sed -i '/^\['name'\]$/,/^\[/!b
/DUMP=/cDUMP=example' $file
DUMP=...
我不知道是否可以在一两个班轮中,但是如果该块中不存在该选项,我该如何添加添加选项?
示例 1:
file1.txt
:
[name]
A=text1
B=text2
DUMP=x
C=text3
[name2]
A=text12
B=text22
DUMP=x2
C=text32
sed '/^\['name'\]$/,/^\[/!b
/DUMP=/cDUMP=example' file1.txt
输出:
[name]
A=text1
B=text2
DUMP=example
C=text3
[name2]
A=text12
B=text22
DUMP=x2
C=text32
示例 2:
file1.txt
:
[name]
A=text1
B=text2
C=text3
[name2]
A=text12
B=text22
DUMP=x2
C=text32
sed '/^\['name'\]$/,/^\[/!b
/DUMP=/cDUMP=example
<add DUMP incase it doesn't exist>' file1.txt
输出:
[name]
A=text1
B=text2
C=text3
DUMP=example
[name2]
A=text12
B=text22
DUMP=x2
C=text32
解决方案
awk '/^\[/&&/]$/&&s&&!f{print " DUMP=example"; s=0}
$0 ~ "^\["blockname"]$"{s=1;f=0}
s&&/^ *DUMP=/{$0=" DUMP=example"; f=1}
1
END{if(s&&!f) print " DUMP=example"; } blockname="name" <file>
在这里,我们做了以下事情:
- 变量
s
检查是否找到正确的块 - 变量
f
检查是否在正确的块DUMP=
中找到了条目 /^\[/&&/]$/&&s&&!f{print " DUMP=example"; s=0}
::如果我们输入一个新块,并且前一个块是正确的 (s==1
) 并且该块没有DUMP=
条目 (f==0
),则写入一个。s&&/^ *DUMP=/{$0=" DUMP=example"; f=1}
::如果我们在正确的块 (s==1
) 中,并且我们找到了一个DUMP=
条目,则更新它。
推荐阅读
- javascript - 即使出现错误,Javascript 验证也允许提交
- sql - 如何在 Manjaro/Arch Linux 上将 CSV 复制到 pgadmin4 中?(权限问题)
- google-cloud-platform - “gcloud init”命令返回“权限被拒绝”
- c# - 从 ASP.NET Razor Pages 中的数据库中检索数据
- retrofit - 无法评估表达式找不到 java.util.List 的源类
- php - X-XSS-Protection 标头未定义
- vim - 除非我在 repl 中切换到命名空间,否则表单评估会运行整个文件
- unity3d - 有 Unity 类似手机的多人游戏系统吗?
- python-3.x - 如何在当前行之前 60 秒返回行的索引
- arm - ARMv6M ADD(register) T2 Encoding 规范中的“DN”是什么?