簡體   English   中英

SED - 當文件中不存在特定字符串時,在特定模式后插入保存的值

[英]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 之后

  • 但前提是整個文件不包含字符串 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”例子試試,你會看到多余的行沒有打印出來。

這可能對你有用(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM