2016-08-24 65 views
0

我寫bash腳本一個反斜槓和我有一個變量SED去除變量

TYPE="type=\$(echo \"\$type\" | sed 's|/|\\/|g')" 

,我想插入到一個文本文件

試圖插入到第15行使用sed的

sed -i "15i$TYPE" filename 

出應插入到文件中的行應是

type=$(echo "$type" | sed 's|/|\\/|g') 

但我得到:

type=$(echo "$type" | sed 's|/|\/|g') 

有一個反斜槓丟失,我怎麼能獲得與2個反斜槓所需的輸出。

+0

謝謝,但我得到了和我以前一樣的確切線 –

回答

0

你得到一個反斜槓一對雙引號中 - 只需使用2對

TYPE="type=\$(echo \"\$type\" | sed 's|/|\\\\/|g')" 
1

使用這裏-DOC,以避免不必要的轉義:

read -r TYPE <<-'EOF' 
type=$(echo "$type" | sed 's|/|\\\\/|g') 
EOF 

記住,你需要輸入\\爲每個\

然後用它作爲:

sed -i "15i$TYPE" filename 
+0

@Max_il:這是否工作? – anubhava

0

變量TYPE沒有得到雙重反彈:

$ TYPE="type=\$(echo \"\$type\" | sed 's|/|\\/|g')" 
$ echo "$TYPE" 
type=$(echo "$type" | sed 's|/|\/|g') 

有幾種方法可以進去TYPE值包含正確的字符串:

  • 轉換每個所需的\一逃脫\\之一:

    $ TYPE="type=\$(echo \"\$type\" | sed 's|/|\\\\/|g')"; echo "$TYPE" 
    type=$(echo "$type" | sed 's|/|\\/|g') 
    
  • 使用單引號作爲外部容器:

    $ TYPE='type=$(echo "$type" | sed '\''s|/|\\/|g'\'')'; echo "$TYPE" 
    type=$(echo "$type" | sed 's|/|\\/|g') 
    
  • 用printf作爲幫助:

    $ printf -v TYPE '%s' 'type=$(echo "$type" | sed '\''s|/|\\/|g'\'')'; echo "$TYPE" 
    type=$(echo "$type" | sed 's|/|\\/|g') 
    
  • 使用C字符串風格:

    $ TYPE=$'type=$(echo "$type" | sed \047s|/|\\\\/|g\047';echo "$TYPE" 
    type=$(echo "$type" | sed 's|/|\\/|g' 
    
  • 或者使用讀取的-r選項,以避免轉換\\

    $ read -r TYPE <<\EOF 
    > type=$(echo "$type" | sed 's|/|\\/|g' 
    > EOF 
    
    $ echo "$TYPE" 
    type=$(echo "$type" | sed 's|/|\\/|g' 
    
0

要使用bash更改變/\就是:

$ type='a/b/c' 
$ type="${type//\//\\}" 
$ echo "$type" 
a\b\c 

即不需要SED。如果你想要把一條線,這是否像一個文件:

$ cat file 
a 
b 
c 
d 

那麼這是任一:

$ awk 'BEGIN{var=ARGV[1]; ARGV[1]=""} NR==3{print var}1' 'type="${type//\//\\}"' file 
a 
b 
type="${type//\//\\}" 
c 
d 

$ var='type="${type//\//\\}"' awk 'NR==3{print ENVIRON["var"]}1' file 
a 
b 
type="${type//\//\\}" 
c 
d 

更改3以上15或任何你喜歡。