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