我需要在列表中添加引号。稍后我将把这个列表导入邮递员。
我有一个这样的列表:
SurName Name email@host.foo
otherSurName otherName otheremail@host.bar
我需要的是:
"SurName Name" email@host.foo
我希望使用 sed 可以做到这一点,但无法想象如何。
尝试这样做:
sed -r 's/^(.*) +(.*@.*)/"\1" \2/' file
或者
sed -r 's/^(.*) +([^ ]+)$/"\1" \2/' file
这种形式允许0 to N
在名称部分有空格,sed
命令会处理
如果您的整个文件是这样订购的,您可以简单地使用
sed -e 's/^\(.*\) \(.*\) \(.*\)$/"\1 \2" \3/'
第一个引号很简单,s/^/"/
第二个有点棘手,但是您可以使用以下模式将其锚定到电子邮件地址:s/ *[^@ ]*@[^@]*$/"&/
,例如:
sed 's/^/"/; s/ *[^@ ]*@[^@]*$/"&/' file
输出:
"SurName Name" email@host.foo
"otherSurName otherName" otheremail@host.bar
另一个 sed 选项:
sed '{
s/^/"/
s/ \([^ ]*\)$/" \1/
}' inputFile
在一行上做同样的事情:
sed 's/^/"/;s/ \([^ ]*\)$/" \1/' inputFile
你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