[英]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.