首页 > 解决方案 > 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之后

所以这应该是第一个例子的结果

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 不会保存括号中的值...

任何人都可以帮助我吗?

谢谢你。

标签: regexlinuxbashsed

解决方案


如果您愿意使用 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”例子试试,你会发现多余的行没有打印出来。


推荐阅读