2017-10-12 188 views
1

我已閱讀以下內容:的Linux替換爲變量包含雙引號

我瞭解到,我可以使用sed "s/STRING/$var1/g"來替換字符串變量的內容。但是,我很難找到如何替換包含雙引號,括號和感嘆號的變量。

然後,希望能夠逃脫報價,我試圖通過sed 's/\"/\\\"/g'管道我的結果,這給了我另一個錯誤sed: -e expression #1, char 7: unknown command: E'。我希望能夠逃避有問題的字符,然後做可變更換:sed "s/STRING/$var1/g"。但是我也無法達到那麼遠。

我想你們可能知道一個更好的方法來用包含引號的變量替換字符串。

FILE1.TXT:

Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 

變量:

var1=$(cat file1.txt) 

實施例:

echo "STRING" | sed "s/STRING/$var1/g" 

希望的輸出:

Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 
+0

'sed'不是此替換的正確工具。 – anubhava

+0

@anubhava我明白了。感謝Anubhava的建議。我願意接受任何有效的工作。也會嘗試做更多的研究。編輯問題以反映這一點。 – DomainsFeatured

+0

@batMan是的,這就是主意。保持變量中的數據相同。我想用'$ var1'的內容替換'STRING'。這就是我卡住的地方。這只是一個極簡主義的例子。 – DomainsFeatured

回答

2

使用AWK

$ echo "STRING" | awk -v var="$var1" '{ gsub(/STRING/,var,$0); print $0}' 
Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 

-v var="$var1":要在AWK
gsub(/STRING/,var,$0)使用shell變量:要全局替代品在整個記錄$0 「STRING」 的所有出現與var

特殊情況:「如果你的var&在它「說在線的開始,那麼它會產生問題gsub因爲&有一個特殊的含義,而是指相應的文字。

爲了應對這種情況,我們已經逃離&如下:

$ echo "STRING" | awk -v var="$var1" '{ gsub(/&/,"\\\\&",var); gsub(/STRING/,var,$0);print $0}' 
&Example test here 
<tag>"Hello! [world]" This line sucks!</tag> 
End example file 
+0

謝謝@batMan。這對我有用。你是我的英雄。 – DomainsFeatured

+1

@DomainsFeatured::) – batMan

+0

在很多情況下,這是行不通的。 。例如。如果'$ var1'在任何地方都包含'&'字符。 – anubhava

2

的問題不是引號。您錯過了「s」命令,導致sed/STRING/視爲行地址,將$var1作爲在匹配行上執行的命令。此外,$var1還有未換行的換行符和/字符,這會在替換中造成麻煩。所以加了「S」和逃避相關的字符$var1

var1escaped="$(echo "$var1" | sed '[email protected][\/&]@\\&@; $ !s/$/\\/')" 
echo "STRING" | sed "s/STRING/$var1escaped/" 

...但實際上,@蝙蝠俠的答案(使用awk)可能是一個更好的解決方案。

+0

Ooops。我用「s」來運行它,但它也不起作用。你的答案確實有用!有用於學習目的的背景信息很好。你逃脫那些其他角色的技能是高超的。 – DomainsFeatured

+0

@ Gordon-Davisson:這真的很有幫助。你能解釋一下你的第二部分,即'$!s/$/\\ /' – batMan

+0

@batMan這部分轉義了新行*,除了文件末尾的那個(/字符串)。坦率地說,這相當混亂。 'echo'在變量的末尾添加一個換行符,在'sed'中,'$!'地址適用於文件的最後一行,而's/$/\\ /'在行尾添加一個反斜槓(反斜槓加倍,因爲它必須逃避自己......)。請注意,'$'在這裏扮演着兩種不同的角色 - 在線路地址中它匹配最後一行;在替代模式中,它匹配行的末尾。然後,在完成之後,'$()'刪除最後一個換行符。 –

1

這裏是一個awk命令是獲取來自可能包括所有種類的特殊字符,如&\等文件文本對被替換:

awk -v pat="STRING" 'ARGV[1] == FILENAME { 
    # read replacement text from first file in arguments 
    a = (a == "" ? "" : a RS) $0 
    next 
} 
{ 
    # now run a loop using index function and use substr to get the replacements 
    s = "" 
    while(p = index($0, pat)) { 
     s = s substr($0, 1, p-1) a 
     $0 = substr($0, p+length(pat)) 
    } 
    $0 = s $0 
} 1' File1.txt <(echo "STRING") 

爲了能夠處理所有這種命令可以避免任何基於正則表達式的函數。我們使用基於純文本的功能,例如indexsubstr等。

+1

這真是太棒了!但是,非常有用!謝謝@Anubhava :-) – DomainsFeatured