[英]Sed: How to replace a string found after a specific pattern is located in a file
[英]SED - Insert saved value after certain pattern when a specific string doesn't exist in the 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
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不会将值保存在括号中......
有人可以帮我吗?
谢谢你。
如果您接受 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”例子试试,你会看到多余的行没有打印出来。
这可能对你有用(GNU sed):
sed -E ':a;N;$!ba;/STAINLESS/b;
s/^(.*LET:\sDimS\s*\(([^)]*).*\n(\s*)S DimS[^\n]*\n)/\1\3MAT: '\''\2 correction'\''/' file
将整个文件收集到内存中并测试它是否包含单词STAINLESS
。 如果是这样,则另当别论:使用模式匹配插入所需的文本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.