26

我有以下单词列表:

name,id,3

我需要像这样双引号:

"name,id,3"

我已经尝试sed 's/.*/\"&\"/g'并得到:

"name,id,3

其中只有一个双引号,并且缺少结束双引号。

我也尝试awk {print "\""$1"\""}过完全相同的结果。我需要帮助。

4

7 回答 7

26

使用它将您的输入传输到:

sed 's/^/"/;s/$/"/'

^是线开始$的锚点和线结束的锚点。使用该sed行,我们分别用"和替换行开始和行结束"

例子:

$ echo -e "name,id,2\nname,id,3\nname,id,4"|sed 's/^/"/;s/$/"/'
"name,id,2"
"name,id,3"
"name,id,4"

没有sed

$ echo -e "name,id,2\nname,id,3\nname,id,4"
name,id,2
name,id,3
name,id,4

您的文件似乎有 DOS 行结尾。dos2unix 通过管道。

证明:

$ cat test.txt
name,id,2
name,id,3
name,id,4
$ sed 's/^/"/;s/$/"/' test.txt
"name,id,2
"name,id,3
"name,id,4
$ cat test.txt|dos2unix|sed 's/^/"/;s/$/"/'
"name,id,2"
"name,id,3"
"name,id,4"
于 2012-05-25T12:57:00.327 回答
18

您的输入文件在行尾有回车符。您需要dos2unix在文件上使用来删除它们。或者你可以这样做:

sed 's/\(.*\)\r/"\1"/g'

这将删除回车并添加引号。

于 2012-05-25T13:32:41.587 回答
11

您可以像这样使用 awk 而不是 sed:

line='name,id,3'
echo $line | awk '{printf("\"%s\"\n", $0);}'

或者更好的是像这样使用 BASH printf:

printf '"%s"\n' $line
于 2012-05-25T13:32:56.347 回答
7

我发现最简单的方法是使用 HEX 代码作为双引号:

 echo name,id,3 | awk '{print "\x22" $1 "\x22"}'
 "name,id,3"
于 2015-07-14T16:24:56.770 回答
3

类似于@Dennis 解决方案,

利用

sed 's/\(.*\)/"\1"/g'

无需查找'\r',这将对所有字符串应用双引号。这不需要在输入文件上运行 dos2unix。

于 2018-04-16T09:55:34.943 回答
-1

在使用 sed 命令之前,您可以使用 \ 作为转义字符,然后它将在您的字符串中打印 "。例如,我使用以下命令将类似的字符串放在文本文件的第一行:

var = "\"name,id,3\""
sed -i '1i' "$var" /tmp/out.txt
于 2020-11-26T13:46:15.620 回答
-1

这对我有用:

echo name,id,3 | sed 's/name,id,3/"name,id,3"/'
"name,id,3"
于 2021-12-18T03:34:20.027 回答