sed 或 grep 正则表达式问题

sed 或 grep 正则表达式问题

我很难使用 sed 或 grep 从字符串中提取一段文本。

我使用的示例字符串是:

|a Milton, John, |d 1608-1674.

我可以使用 sed 提取“John”,以及论坛上的一些建议:

sed 's/[^,]*,\([^,]*\),.*/\1/'

但我正在与“米尔顿”作斗争。

答案1

假设该行的开头有|a,让我们稍微改变一下该模式:

$ echo '|a Milton, John, |d 1608-1674.' | sed -E 's/^\|a ([^,]*), *([^,]*),.*/\1/'
Milton

sed -E使用扩展的正则表达式,因此我们可以(...)不使用反斜杠进行分组。然后我们匹配前导|a和空格,选择组中下一个逗号之前的所有内容([^,]*),,忽略空格␣*,并以与第一个组相同的方式选择另一个组。吃掉,.*了该行的其余部分,我们可以将其全部替换为第一组\1(此处Milton)或第二组\2John)。

当然,如果 是|a告诉我们这个特定字段包含什么,并且字段可能采用其他顺序(例如|d ... |a ...),那么我们需要不同的东西。

相关内容