regex - SED - 当文件中不存在特定字符串时,在特定模式后插入保存的值
问题描述
我有类似于此的文件:
LET: DimX (2660.0)
LET: DimZ (1050.0)
LET: DimS (0.8)
LET: DREHEN (20)
DIM: X DimX
Z DimZ+0.5
S DimS
REF: X1 FOD-23.24
X2 FOD-23.24
Z1 FOD-24.86
Z2 FOD-24.86
POS: CENT_FUNC 1
QSU 10 QSD 10
TURN_AROUND
像这样 -请注意第二个中的 STAINLESS:
LET: DimX (2660.0)
LET: DimZ (1050.0)
LET: DimS (0.7)
LET: DREHEN (20)
DIM: X DimX
Z DimZ+0.5
S DimS
STAINLESS
REF: X1 FOD-23.24
X2 FOD-23.24
Z1 FOD-24.86
Z2 FOD-24.86
POS: CENT_FUNC 1
QSU 10 QSD 10
TURN_AROUND
我想在匹配 LET: DimS ( XX )的行中的括号中保存值 并插入新行 MAT: 'XX correction ' - 其中 XX 是保存值。在S DimS之后
- 但前提是整个文件不包含字符串 STAINLESS。
所以这应该是第一个例子的结果:
LET: DimX (2660.0)
LET: DimZ (1050.0)
LET: DimS (0.8)
LET: DREHEN (20)
DIM: X DimX
Z DimZ+0.5
S DimS
MAT: '0.8 correction'
REF: X1 FOD-23.24
X2 FOD-23.24
Z1 FOD-24.86
Z2 FOD-24.86
POS: CENT_FUNC 1
QSU 10 QSD 10
TURN_AROUND
第二个示例的结果应该保持原样,因为它包含 STAINLESS:
LET: DimX (2660.0)
LET: DimZ (1050.0)
LET: DimS (0.7)
LET: DREHEN (20)
DIM: X DimX
Z DimZ+0.5
S DimS
STAINLESS
REF: X1 FOD-23.24
X2 FOD-23.24
Z1 FOD-24.86
Z2 FOD-24.86
POS: CENT_FUNC 1
QSU 10 QSD 10
TURN_AROUND
我试过这个在 S DimS 模式之后添加行:
sed -i -E '/S DimS/I a \\t MAT: "'"0.8 correction"'"'
但这只是给了我:
LET: DimX (2660.0)
LET: DimZ (1050.0)
LET: DimS (0.8)
LET: DREHEN (20)
DIM: X DimX
Z DimZ+0.5
S DimS
MAT: "0.8 correction"
REF: X1 FOD-23.24
X2 FOD-23.24
Z1 FOD-24.86
Z2 FOD-24.86
POS: CENT_FUNC 1
QSU 10 QSD 10
TURN_AROUND
和:
LET: DimX (2660.0)
LET: DimZ (1050.0)
LET: DimS (0.7)
LET: DREHEN (20)
DIM: X DimX
Z DimZ+0.5
S DimS
MAT: "0.8 correction"
STAINLESS
REF: X1 FOD-23.24
X2 FOD-23.24
Z1 FOD-24.86
Z2 FOD-24.86
POS: CENT_FUNC 1
QSU 10 QSD 10
TURN_AROUND
而且 obvioulsy 不会保存括号中的值...
任何人都可以帮助我吗?
谢谢你。
解决方案
如果您愿意使用 awk 解决方案,当除了简单的字符串操作之外还有逻辑要执行时,这通常比 sed 更容易......
# Capture the correction amount
/LET: DimS/ { correction = $3; gsub(/[()]/, "", correction) }
# Get ready to print
$1 == "DIM:" { f = 1 }
# Abort print!!
$1 == "STAINLESS" { f = 0 }
# Now is the time to print the extra line if the flag is still set
NF == 0 && f { printf " MAT: '%s correction'\n", correction; f = 0 }
# Output the original lines of the file
{ print }
测试第一个例子:
$ awk -f a.awk file
LET: DimX (2660.0)
LET: DimZ (1050.0)
LET: DimS (0.8)
LET: DREHEN (20)
DIM: X DimX
Z DimZ+0.5
S DimS
MAT: '0.8 correction'
REF: X1 FOD-23.24
X2 FOD-23.24
Z1 FOD-24.86
Z2 FOD-24.86
POS: CENT_FUNC 1
QSU 10 QSD 10
TURN_AROUND
用你的第二个“STAINLESS”例子试试,你会发现多余的行没有打印出来。
推荐阅读
- qt - QMake - pass variable to child projects
- graph - 如何阅读使用 GRAPH 设置的 Outlook 自定义属性
- java - Mockk - ClassCastException when mocking final class that implements multiple interfaces
- javascript - Why does a `click` event get triggered on my
- friendly-id - 如何修复 :id 和 :slug 的 FriendlyID 重复内容
- java - 何时使用 BindingAdapter,何时使用 MVVM 中的 liveData 或 observable 字段?
- google-maps - 如何使用 url 在我的地图(谷歌地图)上添加图钉?
- reactjs - MUI 中的 CSS 子选择器
- blockchain - 我们可以删除在 cordapp 中交易期间创建的条目。但是在 Cordapp 区块链中是如何实现不变性的呢?
- c++ - boost c++库的read_xml函数中的分段错误