繁体   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