簡體   English   中英

SED 在特定模式后替換 - 括號中的值

[英]SED Replace after certain pattern - value in brackets

我有文件需要用AC (%blabla%+PAR)替換AC %blabla%所有 ocourences 。

ROT: S 3    BL 3900   SPEED 20
    BEN: L 15   
         
ROT: S 2    BLL (DimZ/2+25) BLR (DimZ/2-29) SPEED 20                 
    BEN: L 14-0.5 A 116  AC -1
    
 ROT: S 2   BLR (DimZ/2-29) BLL (DimZ/2-20) SPEED 20                   
     CLA: L 133 A 64    AC -1 
     
ROT: S 1    BLL (DimZ/2-29) BLR (DimZ/2+25) SPEED 20        
    BEN: L 11-0.5  AC -90
    BEN: L 95   AC 1.5 

例如: AC -1應該是AC (-1+PAR) AC 90應該是AC (90+PAR)

我試過的是:

sed "s/\( AC"."\)/\1(/"

但這甚至並不總是添加“(”......我得到:

ROT: S 3    BL 3900   SPEED 20
    BEN: L 15   
         
ROT: S 2    BLL (DimZ/2+25) BLR (DimZ/2-29) SPEED 20                 
    BEN: L 14-0.5 A 116  AC (-1
    
 ROT: S 2   BLR (DimZ/2-29) BLL (DimZ/2-20) SPEED 20                   
     CLA: L 133 A 64    AC -1 
     
ROT: S 1    BLL (DimZ/2-29) BLR (DimZ/2+25) SPEED 20        
    BEN: L 11-0.5  AC (-90
    BEN: L 95   AC (1.5

有人可以幫我嗎?

謝謝你。

$ sed -E 's/(AC )([^ ]*)/\1(\2+PAR)/' ip.txt
ROT: S 3    BL 3900   SPEED 20
    BEN: L 15   
         
ROT: S 2    BLL (DimZ/2+25) BLR (DimZ/2-29) SPEED 20                 
    BEN: L 14-0.5 A 116  AC (-1+PAR)
    
 ROT: S 2   BLR (DimZ/2-29) BLL (DimZ/2-20) SPEED 20                   
     CLA: L 133 A 64    AC (-1+PAR) 
     
ROT: S 1    BLL (DimZ/2-29) BLR (DimZ/2+25) SPEED 20        
    BEN: L 11-0.5  AC (-90+PAR)
    BEN: L 95   AC (1.5+PAR) 
  • -E啟用擴展正則表達式
    • 如果不支持-E請使用sed 's/\\(AC \\)\\([^ ]*\\)/\\1(\\2+PAR)/'
  • (AC )匹配並捕獲AC后跟空格
    • 使用( AC )避免部分匹配或使用\\b(AC )如果支持單詞邊界
  • ([^ ]*)捕獲非空格字符
  • \\1(\\2+PAR)需要的輸出格式

OP 的嘗試有什么問題:

  • "s/\\( AC"."\\)/\\1(/"將被視為s/\\( AC后跟.后跟\\)/\\1(/
    • 可以簡化為sed 's/\\( AC.\\)/\\1(/' --> 除非需要雙引號,否則使用單引號
  • \\( AC.\\)將匹配空格后跟AC后跟任何字符僅一次
  • \\1(會給你捕獲的部分,然后是(

您可以將以下符合 POSIX BRE 的正則表達式與sed

sed "s/\( AC \)\([^[:space:]]*\)/\1(\2+PAR)/" file

查看在線sed演示

如果你有 GNU sed ,我建議

sed -E "s/\b(AC\s+)(\S+)/\1(\2+PAR)/" file

請參閱另一個演示

正則表達式詳情

  • \\( AC \\) - 第 1 組:空格、 AC 、空格(例如,與BAC不匹配)
  • \\([^[:space:]]*\\) - 第 2 組:零個或多個非空白字符
  • \\1(\\2+PAR) - 替換是串聯的 Group 1 value + ( + Group 2 value and +PAR)

GNU sed正則表達式詳細信息

  • \\b - 單詞邊界
  • (AC\\s+) - 第 1 組: AC和一個或多個空格
  • (\\S+) - 第 2 組:一個或多個非空白字符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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