如何在 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 多次出现的两个标记模式之间的行