如何在管道分隔的字段周围添加双引号 ("")

How to add double quotation marks ("") around pipe-separated fields

假设我有一个结构如下的文件:

1|2|3|4|
5|6|7|8|
9|10|11|12|

但是,我希望我的文件看起来像这样(预期输出):

"1"|"2"|"3"|"4"|
"5"|"6"|"7"|"8"|
"9"|"10"|"11"|"12"|

我正在尝试按以下方式使用 sed 命令:

sed 's/^/"/g'

遗憾的是,它只是在每行的开头添加了引号:

"1|2|3|4|
"5|6|7|8|
"9|10|11|12|

^ 表示“一行的开头”。使用 [^|] 代替,意思是“除了 | 之外的任何东西”。如果您的 sed 实现支持 +,您可以使用

sed -E 's/[^|]+/"&"/g'

否则,你需要更冗长

sed  's/[^|][^|]*/"&"/g'

&表示匹配的部分。

您可以使用

sed -E 's/[^|]+/"&"/g' file > newfile

-E 选项启用 POSIX ERE 语法,因此 [^|]+ 匹配除 | 之外的一个或多个字符,并且 "&" 将每个字符替换为它的副本两边都附有 "

参见 online sed demo:

s='1|2|3|4|
5|6|7|8|
9|10|11|12|'
sed -E 's/[^|]+/"&"/g' <<< "$s"

输出:

"1"|"2"|"3"|"4"|
"5"|"6"|"7"|"8"|
"9"|"10"|"11"|"12"|

这里是 gnu awk 做同样事情的方法:

awk -v RS="[|\n]+" '{ORS=RT; print "\"" [=10=] "\""}' file

"1"|"2"|"3"|"4"|
"5"|"6"|"7"|"8"|
"9"|"10"|"11"|"12"|