3

我需要在列表中添加引号。稍后我将把这个列表导入邮递员。

我有一个这样的列表:

SurName Name email@host.foo
otherSurName otherName otheremail@host.bar

我需要的是:

"SurName Name" email@host.foo

我希望使用 sed 可以做到这一点,但无法想象如何。

4

5 回答 5

2

尝试这样做:

sed -r 's/^(.*) +(.*@.*)/"\1" \2/' file

或者

sed -r 's/^(.*) +([^ ]+)$/"\1" \2/' file

笔记

这种形式允许0 to N在名称部分有空格,sed命令会处理

于 2013-03-01T08:14:52.797 回答
1

如果您的整个文件是这样订购的,您可以简单地使用 sed -e 's/^\(.*\) \(.*\) \(.*\)$/"\1 \2" \3/'

于 2013-03-01T08:13:32.810 回答
1

第一个引号很简单,s/^/"/第二个有点棘手,但是您可以使用以下模式将其锚定到电子邮件地址:s/ *[^@ ]*@[^@]*$/"&/,例如:

sed 's/^/"/; s/ *[^@ ]*@[^@]*$/"&/' file

输出:

"SurName Name" email@host.foo
"otherSurName otherName" otheremail@host.bar
于 2013-03-01T08:15:04.823 回答
1

另一个 sed 选项:

sed '{
s/^/"/
s/ \([^ ]*\)$/" \1/
}' inputFile

在一行上做同样的事情:

sed 's/^/"/;s/ \([^ ]*\)$/" \1/' inputFile
于 2013-03-01T08:19:23.540 回答
1

awk可以这样做:

awk '{$1="\""$1; $2=$2"\""}1' file

测试

$ awk '{$1="\""$1; $2=$2"\""}1' file
"SurName Name" email@host.foo
"otherSurName otherName" otheremail@host.bar

如果您还想处理只有两列的情况,请执行以下操作:

$ awk '{if (NF==2) $1="\""$1"\""; else {$1="\""$1; $2=$2"\""}}1' file
"SurName Name" email@host.foo
"otherSurName otherName" otheremail@host.bar
"thirdname" sdfff@sdff.go

或者,如果知道只有 2 或 3 列,您可以缩短一点:

awk '{$1="\""$1;$(NF-1)=$(NF-1)"\""}1' file

如果要处理没有名称的行,请执行以下操作:

awk '{if(NF>2){$1="\""$1; $2=$2"\""}}1' file

演示

$ awk '{if(NF>2){$1="\""$1; $2=$2"\""}}1' file
"SurName Name" email@host.foo
"otherSurName otherName" otheremail@host.bar
thirdname sdfff@sdff.go
sdfdf@sddf.su
于 2013-03-01T08:21:22.913 回答