regex - SED 在特定模式后替换 - 括号中的值

标签 regex linux sed

我有一些文件需要替换所有出现的 AC %blabla%AC (%blabla%+PAR)

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

有人可以帮我吗?

谢谢。

最佳答案

您可以使用以下符合 POSIX BRE 的正则表达式 sed :

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

请参阅online sed demo

如果你有 GNU sed ,我建议

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

参见another demo .

正则表达式详细信息

  • \( AC \) - 第 1 组:空间,AC 、空格(例如,与 BAC 不匹配)
  • \([^[:space:]]*\) - 第 2 组:零个或多个非空白字符
  • \1(\2+PAR) - 替换为串联的第 1 组值 + ( + 第 2 组值和 +PAR) .

GNU sed正则表达式详细信息

  • \b - 单词边界
  • (AC\s+) - 第 1 组:AC和一个或多个空格
  • (\S+) - 第 2 组:一个或多个非空白字符。

关于regex - SED 在特定模式后替换 - 括号中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63827651/

相关文章:

linux - Linux 中两个文件重叠或分别用 file2 中的行替换 file1 中的行

javascript - 从 url 中删除所有空值

regex - perl:用另一个列表替换子字符串列表

windows - 适用于 Windows 和 Linux 的 Delphi

linux - 如何在 CentOS 中添加 100MB 的交换空间作为逻辑卷?

c++ - 从 Qt 4.x (Ubuntu Linux) 迁移到 Qt 5.1 (Windows 7)

shell - 如何在 UNIX 中将两个行号之间的文本打印到新文件中

PHP preg_replace 修改

javascript - 用于解析可能用引号表示的参数的正则表达式

bash - 从文本文件中删除特殊字符(<200c> <200d>