如何逃避一个单引号在 awk

我想做以下几件事

awk 'BEGIN {FS=" ";} {printf "'%s' ", $1}'

但是这样逃避单引号是行不通的

awk 'BEGIN {FS=" ";} {printf "\'%s\' ", $1}'

怎么做? 谢谢帮忙。

146913 次浏览

也许这就是你要找的:

awk 'BEGIN {FS=" ";} {printf "'\''%s'\'' ", $1}'

也就是说,使用 '\''关闭打开的 ',然后通过转义打印字面 ',最后再次打开 '

单引号使用 \x27表示

就像

awk 'BEGIN {FS=" ";} {printf "\x27%s\x27 ", $1}'

来源

awk 'BEGIN {FS=" "} {printf "\047%s\047 ", $1}'

另一个选项是传递单引号 作为 awk 变量:

awk -v q=\' 'BEGIN {FS=" ";} {printf "%s%s%s ", q, $1, q}'

使用字符串连接的简单示例:

# Prints 'test me', *including* the single quotes.
awk -v q=\' '{ print q $0 q }' <<<'test me'

对于小型脚本,使其可读的一种可选方法是使用如下变量:

awk -v fmt="'%s'\n" '{printf fmt, $1}'

我发现它很方便,因为我必须在输出中多次生成单引号字符,而且 \047使它完全不可读。

当您在命令行中使用 awk 时,不必使用 BEGIN 块来定义字段分隔符(FS) ,只能使用-F“”,如:

awk -F" " {printf "\047%s\047 ", $1}'

为您节省了一些打字时间。 :)

更新1 : $1单一报价问题的更多免提方法:

 1  echo " 123  xyz 456 abc "


'123'


        

{m,g}awk 'BEGIN { __=_
OFS =  sprintf("%c",
++_  +_++*_+_++^++_+_*++_)
_+=_^= FS  = "^|[[:space:]]+"
} NF +=_ ==( NF = _)'

===========================

到目前为止,mawk拥有最简洁的语法,可以在不使用 printf语句的情况下用单引号包装行:

gawk 'NF+=   substr(!_, $2 =$_ ($_=_))' FS='^$' OFS='\47'
nawk '$2 =$-_ substr(_, $-_=_, NF = 3)' FS='^$' OFS='\47'


mawk '$++NF=$_ ($_=_)' FS=^$ OFS=\\47

输入

<( [[[a]]]bc:
뀿 123=)>

输出

' [[[a]]]bc:
뀿 123='

我故意把它包装在 <(…)>中,以指出有前沿空间。这两条线之间的间隙是 \f : form feed \014

也就是说,这只包装了行,而没有在行本身中转义单引号。

如果使用 sub(),它看起来会像:

{m,n,g}awk -F'^$' 'sub(".*","\47&\47")'

另一种方式: awk 'BEGIN {FS=" ";} {printf "%c%s%c ", 39, $1, 39}'

使用 %c并给出单引号的 ASCII 代码号,即39。 顺便说一下,如果您需要打印双引号,ASCII 代码是34!