如何在 SED 或 AWK 的行中添加双引号?

Posted

技术标签:

【中文标题】如何在 SED 或 AWK 的行中添加双引号?【英文标题】:How to add double quotes to a line with SED or AWK? 【发布时间】:2012-06-01 01:14:46 【问题描述】:

我有以下单词列表:

name,id,3

我需要像这样双引号:

"name,id,3"

我试过sed 's/.*/\"&\"/g',得到了:

"name,id,3

只有一个双引号,缺少结束双引号。

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

【问题讨论】:

你的 sed 命令在我的电脑上运行。您可以省略双引号之前的反斜杠,因为它们在单引号字符串中无用。 嗯,是的,这很奇怪。我得到一个双引号。我的原始文件是 file.csv——有一长串“name,id,[[:num:]]”。为什么它不起作用? g 不是必需的,但它不会导致您的问题。你的平台是什么? 【参考方案1】:

这对我有用:

echo name,id,3 | sed 's/name,id,3/"name,id,3"/'
"name,id,3"

【讨论】:

【参考方案2】:

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

var = "\"name,id,3\""
sed -i '1i' "$var" /tmp/out.txt

【讨论】:

【参考方案3】:

类似于@Dennis 解决方案,

使用

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

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

【讨论】:

【参考方案4】:

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

 echo name,id,3 | awk 'print "\x22" $1 "\x22"'
 "name,id,3"

【讨论】:

【参考方案5】:

使用它来将您的输入输入:

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 first

证明:

$ 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"

【讨论】:

【参考方案6】:

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

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

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

printf '"%s"\n' $line

【讨论】:

我有这样的命令,但我需要将每个输出行包含在“”中。如何修改这个命令? :awk ' for (i = 2; i result.txt 引用每一行只需使用:awk 'printf("\"%s\"\n", $0)' file【参考方案7】:

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

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

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

【讨论】:

成功了!没错,文件来自windows,是在windows中生成的 很好的解决方案!你能解释一下 \r 和 "\1" 在这里做什么吗? @satch_boogie: \r 是回车。 \1 是由括号完成的捕获的内容(因此在这种情况下,是回车之前的整行)。结果是删除了回车并添加了引号。我认为最后的g (global) 是不必要的,但我的回答保留了 OP 的问题。有关捕获组的更多信息,请参阅this。

以上是关于如何在 SED 或 AWK 的行中添加双引号?的主要内容,如果未能解决你的问题,请参考以下文章

使用 awk 或 sed 删除特定字符

如何在sed中使用变量

如何选择可能使用 awk/sed 多次出现的两个标记模式之间的行

如何使用 vim 命令或 sed/awk 命令将具有不同列数的行分隔到另一个文件中? [关闭]

如何在 sed 中转义斜杠和双引号和单引号?

如何通过 `awk` 或 `sed` 在 Ubuntu 终端变量的末尾添加一些字符?