就像是:
cat script.log | sed -n '/Name:/s/^.*Name:\([^)]*\)).*$/\1/gp'
应该做的工作。
您在原始表达式中的最大错误是您逃脱了第二个括号。当我运行您的代码段时,出现错误:
sed: 1: "s/Name:\(.*\)\)/\1/g": RE error: parentheses not balanced
即使您更正了这一点,您也会发现 sed 默认打印每一行。这是我建立的表达式的作用。
Sed 表达式采用[address[,address]]function[arguments]
. 您的表达式不包含任何可选的地址元素。我包含了一个与任何包含“名称:”的行匹配的地址( )。/Name:/
该函数是需要两个参数的替换函数 - (1) 搜索模式和 (2) 替换表达式。搜索模式匹配整行并提取“名称:”之后包含零个或多个字符的行的段,直到第一个括号。“转义”括号定义捕获组,未转义的括号终止捕获。该模式包括该行的其余部分(例如,.*$
)。由于整行匹配,它将被替换表达式替换,该替换表达式仅包含捕获的部分。
综上所述,简单的 sed 语句匹配任何包含“Name:”的行,并将整行替换为Name:
第一个左括号 ( )
) 之间的字符。-n
标志和标志的添加确保p
只打印匹配的行。