Unix 使用sed将匹配项括在双引号中

Unix 使用sed将匹配项括在双引号中,unix,sed,Unix,Sed,我试图从电子邮件中提取标题,并从中创建一个JSON片段。我使用sed提取键和值,但它无法在每一行上添加尾随引号: $ cat email1 | grep -i -e "^subject:" -e "^from:" -e "^to:" | \ sed -n 's/\^([^:]*\):[ ]*\(.*\)$/"\1":"\2"/gp' "From":"Blah Blech <blah.blech@blahblech.com> "To":"foo@bar.com "Subjec

我试图从电子邮件中提取标题,并从中创建一个JSON片段。我使用sed提取键和值,但它无法在每一行上添加尾随引号:

$ cat email1 | grep -i -e "^subject:" -e "^from:" -e "^to:" | \
    sed -n 's/\^([^:]*\):[ ]*\(.*\)$/"\1":"\2"/gp'

"From":"Blah Blech <blah.blech@blahblech.com>
"To":"foo@bar.com
"Subject":"Yeah
$cat email1 | grep-i-e“^主题:“-e”^发件人:“-e”^收件人:”\
sed-n的/\^([^::]*\):[]*\(.*\)$/“\1”:“\2”/gp”
“来自”:“废话
“至”:foo@bar.com
“主题”:“是的
我不明白为什么更换模式不起作用。

救命啊

 $ awk -F": *" -vOFS=":" -vq="\"" 'tolower($0)~/^from|to|subject/
                                   {print q$1q,q$2q}' email1

它还结合了
cat
grep
步骤。

按照@tripleee的建议剥离回车符修复了sed的问题(使用ctrl-v ctrl-m捕获文本回车符):

$cat email1 | tr-d'^M'| grep-i-e“^主题:“-e”^发件人:“-e”^收件人:”\
sed-n的/^\([^::]*\):[]*\(.*\)$/“\1”:“\2”/gp”
“发件人”:“废话”
“至”:foo@bar.com"
“主题”:“是的”

我猜它工作正常,但您的输入在每行都有DOS回车。请尝试使用
dos2unix
或其他解决方案来解决这个庞大的常见问题。另外,请避免使用You's right.。这是回车符。剥离这些回车符可以让sed完成这项工作。谢谢。另外,您的第一组括号也不会转义(可通过-r避免),后缀
g
无效,因为每行只能有一个匹配项。请接受其中一个答案(单击选票附近的大空心复选标记,使其变为纯绿色)这样这个问题就不会再被认为是未解决的了。谢谢。你仍然有一个无用的
cat
。你可以用例如
tr-d'^M'来避免它
$ cat email1 | tr -d '^M' | grep -i -e "^subject:" -e "^from:" -e "^to:" | \
    sed -n 's/^\([^:]*\):[ ]*\(.*\)$/"\1":"\2"/gp'

"From":"Blah Blech <blah.blech@blahblech.com>"
"To":"foo@bar.com"
"Subject":"Yeah"