我很难使用 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
)或第二组\2
(John
)。
当然,如果 是|a
告诉我们这个特定字段包含什么,并且字段可能采用其他顺序(例如|d ... |a ...
),那么我们需要不同的东西。