bash脚本中的sed脚本

时间:2014-06-05 09:57:27

标签: regex bash shell sed

我正在尝试创建一个脚本,它只给我括号外的代码。我做了一个bash脚本,我可以给我喜欢的括号。然后我想在我的bash脚本中使用sed。我的sed脚本做了它必须做的事情,因为当我在命令行上使用sed -f myscript时,输出是正确的。但是我现在有问题要在sed脚本中替换我给bash脚本提供的大括号。这是我的代码:

#/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

1 个答案:

答案 0 :(得分: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特有的字符。