4

使用此命令,我可以"在每一行之前添加。

awk '{print "\""$0}' file

但是我想添加'而不是",为什么这个命令不起作用?

awk '{print "\'"$0}' file
4

7 回答 7

6

您绝对不能在单引号分隔的脚本中使用单引号,因为该引号绝对表示该脚本 [segment] 的结尾。您拥有的选项是:

  1. 将脚本放在文件“foo”中{print "'"$0}并执行为:awk -f foo file,或
  2. \047在要打印引号的任何地方使用转义序列: awk '{print "\047"$0}' file,或
  3. 将引号保存在变量中:awk -v q=\' '{print q$0}' file,或
  4. 用双引号而不是单引号分隔 awk 脚本,并转义 shell 可能关心的任何内容: awk "{print \"'\"\$0}" file
  5. 退出 awk 并返回 shell 以获取报价:awk '{print "'\''"$0}' file

上面的最后一个列表项实际上是 awk 脚本 ('{print "''"$0}') 的 2 个单独段,中间有一点 shell ( \') 所以当最终结果是连接这些段时,shell 将它们传递给awk命令执行,你会得到你想要的.

FWIW 如果您的脚本超过几行,我将使用“1”,否则使用“2”或“3”,“3”是我的个人偏好,但 YMMV。我不会做4或5。

于 2013-05-10T18:42:58.003 回答
5

或使用sed

sed -e "s/^/\'/" file
于 2013-05-10T15:06:53.080 回答
4

在bash 中'使用'-delimited 字符串有点棘手:

您必须终止'-string,然后必须将其放在'引号中,然后重新启动'-string:

echo 'ab'\''cd'

将打印

ab'cd

并且,将这些知识应用到您的命令中,您需要

awk '{print "'\''"$0}' file

相同的原则:你想要

{print "'"$0}

并且必须在'. 所以你得到 2 个部分:{print "并且"$0}必须包含在其中'并与 a 一起“加入” \'

'{print "'\''"$0}'
于 2013-05-10T15:13:38.120 回答
2

一种解决方案是仅使用 ASCII 代码'

$ awk '{print "\047"$0}' file
于 2013-05-10T14:28:56.383 回答
1

可能是这种方式?

awk 'sub(/^/,"\x27")'

如果你喜欢print

awk '{print "\x27"$0}'
于 2013-05-10T14:24:43.730 回答
1

正确的做法是:

$ awk -v c="'" '{print c$0}' file
于 2013-05-10T14:24:04.127 回答
0

尝试这个:

awk '$0="'\''"$0'<<XXX
one
two

three
XXX

输出:

'one
'two
'
'three

该字符'应该为调用 shell 转义,因为它是由它而不是由awk. 所以首先它必须关闭(第 2 次'),然后在 shell 中转义(第 4 次) \',然后再次打开(第 4 次')。

于 2013-05-10T16:21:59.837 回答