shell - TCL 脚本查找脚本并在搜索字符串之前添加新文本
问题描述
以下是我的输入文件的部分内容:
xyz
abc
MainContent(abc_dt) {
sc: it;
}
MainContent(xyz_cnt) {
sc : it;
}
MainContent(asd_zxc) {
sc : it;
}
在这里,我想搜索“MainContent”行并想在它之前添加新行......这个新行应该有“Sb(MainContent_1中括号内的文本)”......这也应该添加左括号和右括号在下一次 Sb 出现之前:
脚本的预期输出:
xyz
abc
Sb(abc_dt_sb1) {
MainContent(abc_dt) {
sc: it;
}
}
Sb(xyz_cnt_sb2) {
MainContent(xyz_cnt) {
sc : it;
}
}
Sb(asd_zxc_sb3) {
MainContent(asd_zxc) {
sc : it;
}
}
有人可以帮我为此创建一个 TCL 脚本吗?
解决方案
此代码将在标准输入上处理您的文本并在标准输出上生成结果。根据需要重定向它。
set counter 0
set expectBrace false
while {[gets stdin line] >= 0} {
if {!$expectBrace && [regexp {^\s*MainContent\s*\((\w+)\)} $line -> bits]} {
puts [format "Sb(%s_sb%d) \{" $bits [incr counter]]
set expectBrace true
}
puts $line
if {$expectBrace && [regexp {^\s*\}\s*$} $line]} {
puts "\}"
set expectBrace false
}
}
使用正则表达式来匹配小型状态机(两个状态,由 控制expectBrace
)中状态变化的触发器是非常传统的解析。我曾经在行format
中进行替换Sb(…)
;这些很简单,如果您愿意,您可以使用直接替换。
我没有做任何关于添加缩进的事情。
推荐阅读
- raspberry-pi - 为 Raspberry Pi 3 打包一个 Electron 应用程序
- apache-spark - 来自 RedShift tempDir 转储的 Spark DataFrameReader
- javascript - JavaScript 装饰器可以为方法添加注释吗?
- css - 如何隐藏水平和垂直滚动条会聚的矩形?
- python - Python根据变量值创建和排序列表
- android - 如何更新视图模型对象中的自定义值
- vue.js - 从 NPM 链接解析别名
- jquery - Timepicker 删除/隐藏默认(30 分钟)时间间隔
- php - Laravel:从视图中添加字段(用户:Mass Assignable Attribute)
- security - 清理系统日志中的密码