簡體   English   中英

如何使用awk轉義反斜杠和雙引號

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM