Regex SED-当特定字符串不存在时,在特定模式后插入保存的值';文件中不存在

Regex SED-当特定字符串不存在时,在特定模式后插入保存的值';文件中不存在,regex,linux,bash,sed,Regex,Linux,Bash,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

我有与此类似的文件:

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
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
     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更正”-其中XX是保存值。 在黑暗之后

  • 但仅当整个文件不包含字符串时
所以这应该是第一个例子的结果:

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
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
     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
以及:

而且显然不会保存括号中的值

有人能帮我吗


谢谢。

如果您愿意接受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
尝试第二个“不锈钢”示例,您将看到没有打印额外的行。

这可能适合您(GNU-sed):

将整个文件收集到内存中,测试它是否包含单词
不锈钢
。如果是这样的话,就不要这样做:使用模式匹配插入所需的文本