2014-06-05 86 views
1

我正在試着製作一個腳本,它只在外部大括號中提供代碼。我做了一個bash腳本,我可以給我喜歡的大括號。然後我想在我的bash腳本中使用sed。我的sed腳本做它必須做的事情,因爲當我在命令行上使用sed -f myscript時,輸出是正確的。但我現在有問題來替換我在sed腳本中給我的bash腳本的大括號。這裏是我的代碼:bash腳本中的sed腳本

#/bin/bash 

if [[ $# != 2 ]] 
then 
    echo "Gebruik: verwijderhaakjes.sh <openend symbool> <sluitend symbool>" 
    exit 
fi 
if [ "${#1}" != 1 -o "${#2}" != 1 ] 
then 
    echo "Fout: openend en sluitend symbool moeten uit één enkel karakter bestaan" 
    exit 
fi 
var1=$1 
var2=$2 
sed " 
$!{ 
    /^[a-zA-Z]/{ 
     H 
     d 
    } 
    /^${var2}/{ 
     H 
     d 
    } 
    /^[ ][ ]*/{ 
     d 
    } 
} 
/^[${var2}a-zA-Z]/{ 
    H 
} 
x 
s/${var1}\n//g 
s/${var2}//g 
p 
" 

正如你所看到的,我已經使用了雙引號,我用的sed腳本變量,所以我不知道爲什麼我沒有得到任何輸出。

例如:

testfile的:

aaa { 
    bbb 
    ccc { 
    ddd 
    eee 
    } fff { 
    ggg 
    hhh 
    } 
    iii 
    jjj 
} kkk { 
    lll 
    mmm 
} nnn 
ooo 
ppp 

當我用我的sed腳本是這樣的:

sed -f myscript.sed test.txt 

輸出是這樣的:

aaa kkk nnn 
ooo 
ppp 

這是對。 但是,當我在bash中使用我的sed腳本時,我沒有得到任何輸出。 我想的是:

cat test | bash bashscript.sh "{" "}" 

aaa kkk nnn 
ooo 
ppp 

cat test | tr '}' ']' | tr '{' '[' | bash bashscript.sh "[" "]" 

aaa kkk nnn 
ooo 
ppp 
+0

也許添加一些輸入樣本?並添加預期的輸出。 – konsolebox

+0

@ user3371198對於長字符串,您可以使用[heredocs](https://en.wikipedia.org/wiki/Here_document#Unix_shells)。 – Biffen

回答

0

試試這個:

sed ' 
$!{ 
    /^[a-zA-Z]/{ 
     H 
     d 
    } 
    /^'"${var2}"'/{ 
     H 
     d 
    } 
    /^[ ][ ]*/{ 
     d 
    } 
} 
/^['"${var2}"'a-zA-Z]/{ 
    H 
} 
x 
s/'"${var1}"'\n//g 
s/'"${var2}"'//g 
p 
' 

如果使用圍繞整個SED表達雙引號,shell將擴大字符如$,*等等。所以你需要在除了shell變量之外的任何地方使用單引號。

另一種方法是逃避對shell特殊的字符。

+0

它適用於我的第一個示例,但是當我用'{'替換第二個示例中的'['''時,他說:sed:-e表達式#1,字符85:未終止的命令 – user3371198

+0

因爲'['是一個特殊的正則表達式字符,當你傳入它時,你需要轉義它。試試這個:'cat test | tr'}'']'| tr'{''['| bashscript.sh「\ [」「\]」' – dogbane