0

必须使用什么命令来 grep 文件中 2 个匹配模式之间的项目。我的文件有如下行:

abc def ghi
abc bcd def (task Name: example)
##some other similar lines##

我需要 Name: 和 ')' 之间的数据

我尝试使用命令

cat script.log | sed 's/Name:\(.*\)\)/\1/gp'

此命令没有为我提供所需的结果。请指导我。

此外,是否可以使用 $Name 代替“Name:”(使用替换原始值的变量)

4

3 回答 3

1

你在哪里,试试

echo "abc bcd def (task Name: example)" | sed 's/.*Name: \(.*\)[\)]/\1/'

**output**
example

或者更简单

echo "abc bcd def (task Name: example)" | sed 's/.*Name: \(.*\))/\1/'

请注意,您不需要转义文字结束括号')'。

或(每个请求),带有一个变量

var="Name: "
echo "abc bcd def (task Name: example)" | sed "s/.\*${var}\(.\*\))/\1/"

输出

example

请注意 shell 元字符“*”周围的额外转义字符。

如果您的值var=包含任何外壳元字符,您也需要转义它们。

IHTH

于 2012-12-06T22:45:35.327 回答
1

使用 GNU grep

grep -oP '(?<=Name: )\w+(?=\))' script.log
于 2012-12-06T22:49:58.433 回答
0

就像是:

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只打印匹配的行。

于 2012-12-06T22:43:01.583 回答