2014-06-05 84 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