sed 命令\1 引用捕获组

 正则表达式中使用 (pattern) 定义分组,sed 会按顺序记录这些分组(最多支持9个,即 \1 到 \9)‌

# 将 "key:value" 替换为 "value:key"
echo "key:value" | sed -r 's/(.*):(.*)/\2:\1/'

将路径 /home/user/file.txt 替换为 /backup/user_file.txt 

echo "/home/user/file.txt" | sed -r 's#/([^/]+)/([^/]+)/#/backup/\1_\2/#'

正则表达式中的 ([^/]+) 可分解为以下部分:
‌1. 分组捕获 ( )‌
() 表示捕获分组,用于提取匹配内容,后续可通过 \1 引用该分组内容‌。
‌2. 字符类 [^/]‌
[] 定义字符集合,^ 表示否定,/ 是字面量斜杠。
组合 [^/] 表示匹配‌除斜杠 / 之外‌的任意单个字符‌。
‌3. 量词 +‌
+ 表示匹配前一个元素(即 [^/])‌一次或多次‌,确保捕获连续的非斜杠字符‌。
‌完整含义‌
([^/]+) 表示:
匹配一段‌连续的非斜杠字符‌(如 abc、123)。
将匹配结果保存到第一个分组中,便于后续提取或替

将日志 2023-08-15 ERROR: Failed to connect 调整为 [ERROR] 2023-08-15: Failed to connect

sed -r 's/([0-9-]+) ([A-Z]+): (.*)/[\2] \1: \3/' log.txt
 启用扩展正则‌
使用 -r 选项(GNU sed)或 -E 选项(BSD sed)以支持扩展正则语法,避免对 () 和 \1 转义‌

贪婪匹配问题

正则默认使用贪婪匹配(如 .* 会匹配到行末),可能导致分组捕获不符合预期。可用 .*? 或限定符优化‌  

特殊字符转义
若替换内容包含 /,建议使用其他分隔符(如 # 或 @)以避免冲突:

sed -r 's#/usr/local#/opt#g' config.txt
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值