在sed中使用变量

时间:2018-01-15 16:01:53

标签: bash sed

以下代码无法正常工作。 echo显示正确的命令,但不在文件中进行替换。

文件abcd.txt:

<div class="header"></div>
<div class="main">
  <div class="sidebar"></div>
  <div class="content"></div>
</div>

代码:

\overviewfalse
\part1false
\part2false
\part3false
\part4false
\part5false
\part6false
\part7false

1 个答案:

答案 0 :(得分:5)

使用多个反模式,1)摆脱变量中的shell命令,使用函数或数组。但是根据您的要求,您不需要其中任何一个。 2)单引号不会在任何shell中扩展变量。

只需执行大括号扩展逻辑,而不是使用非标准seq用法,

for iterator in {1..10}; do
    match="part${iterator}false"
    replace="part${iterator}true"
    sed -i "s/${match}/${replace}/" abcd.tex
done

或者对sed使用全部函数,如果你需要一个单独的函数

sed_replace_match() {
    (( "$#" >= 2 )) || { printf 'insufficient arguments\n' >&2; }
    sed -i  "s/${1}/${2}/" abcd.tex
}

并使用搜索和替换模式调用该函数,即

sed_replace_match "$match" "$replace"

或者如果您只想一次性完成所有操作,只需使用GNU sed并且不要担心数字,因为它们作为捕获组\1的一部分保留在替换中。下面的例子

sed -r 's/part([0-9]*)false/part\1true/g' abcd.tex

如果内容看起来不错,请使用-i选项进行文件的就地编辑。或者对于任何符合POSIX的sed,只需使用

sed 's/part\([0-9]*\)false/part\1true/' file