[英]How to escape backslash and double quotes with awk
我有些awk重新排列了一行。 我想對變量之一(例如$ _)進行轉義,以使"
和\\
用反斜杠轉義。
例:
echo "Ehm, \"hi\", he \\ said" | awk '{$1="" ; print "\"" $_ "\"" }'
" "hi", he \ said"
(不要更改回聲,通常我從帶有Ehm, "hi", he \\ said
的文件中讀取Ehm, "hi", he \\ said
在其中Ehm, "hi", he \\ said
)。
我想擁有
" \"hi\", he \\ said"
代替。 我怎樣才能做到這一點? awk中是否有一個功能可以做到這一點?
您訴諸awk有什么理由嗎? Bash完全能夠執行字符串操作:
#!/bin/bash
read -r ignored line <<<'Ehm, "hi", he \ said'
line=${line//\\/\\\\}
line=${line//\"/\\\"}
echo $line
輸出量
\"hi\", he \\ said
這是您要找的東西嗎?
$ 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"
當使用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, "\\""
要刪除第一個字段,我們可以采用正確的方法 :
$ 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"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.