2016-08-24 527 views
1

我有一些awk重新排列一行。我想跳过其中一个变量(例如$ _),以这种方式"\以反斜杠转义。如何用awk转义反斜杠和双引号

实施例:

echo "Ehm, \"hi\", he \\ said" | awk '{$1="" ; print "\"" $_ "\"" }' 
" "hi", he \ said" 

(不改变回波,通常我从在它具有Ehm, "hi", he \ said文件读取)。

我想有

" \"hi\", he \\ said" 

代替。我怎样才能做到这一点?有没有awk中的函数可以做到这一点?

+1

什么是'$ _'在awk程序的情况下? –

+0

@Tom这意味着,该行的其余部分 –

+1

正如在[这个问题](http://stackoverflow.com/q/6293790/2088135)的答案中提到的,它看起来像'$ _'结束工作,因为'_'评估为'0',所以你最终得到'$ 0'。在awk脚本中看到'$ _'并不典型。使用'$ 0'来引用整行。 –

回答

1

当你用Bash传递一个字符串时,你必须考虑echo本身正在用双引号执行什么。在这里找到:

$ echo "Ehm, \"hi\", he \\ said" | awk '1' 
Ehm, "hi", he \ said 

使用单引号解决问题的一部分:

$ echo 'Ehm, \"hi\", he \\ said' | awk '1' 
Ehm, \"hi\", he \\ said 

这是说,现在是时候添加字符串引号包围。为此,我们使用print以及三个参数 - >print "\"", $0, "\""

要删除第一个领域,我们可以做到这一点in the correct way

$ echo 'Ehm, \"hi\", he \\ said' | awk '{sub(/^\S+\s*/, ""); print "\"", $0, "\""}' 
"\"hi\", he \\ said" 

如果我们只是空白,它看起来我们得到您想要的输出是什么:

$ echo 'Ehm, \"hi\", he \\ said' | awk '{$1=""; print "\"", $0, "\""}' 
" \"hi\", he \\ said" 
+0

为什么使用'sprintf'然后添加'1'来打印,当你可以使用'printf'(甚至只是'print')? –

+0

回声只是一个例子,通常'Ehm,“嗨”,他\说''在awk处理的文件中。 awk并没有逃脱原来变量的任何东西 –

+0

@TomFenech ha!因为我过多地改变了我失去焦点的字符串:D – fedorqui

2

是否有你诉诸awk的原因是什么? Bash是完全能够执行字符串操作:

#!/bin/bash 

read -r ignored line <<<'Ehm, "hi", he \ said' 
line=${line//\\/\\\\} 
line=${line//\"/\\\"} 
echo $line 

输出

\"hi\", he \\ said 
2

这是你在找什么?

$ cat tst.awk 
function foo(str) { 
    sub(/^[^[:space:]]+/,"",str) # remove first field 
    gsub(/["\\]/,"\\\\&",str)  # put \ before each \ and " 
    return "\"" str "\""   # surround with quotes 
} 
{ print foo($0) } 

测试:

$ echo "Ehm, \"hi\", he \\ said" | awk -f tst.awk 
" \"hi\", he \\ said" 

$ cat file 
Ehm, "hi", he \ said 

$ awk -f tst.awk file 
" \"hi\", he \\ said"