bash - 在 sed 中使用变量

标签 bash sed

不知何故,以下代码不起作用。回显显示正确的命令,但不会在文件中进行替换。

文件abcd.txt:

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

代码:

function convert_to_true()
{
        sed -i 's/overviewfalse/overviewtrue/' abcd.txt
        for iterator in `seq 1 10`; do
                match=part${iterator}false
                replace=part${iterator}true
                command="sed -i 's/${match}/${replace}/' abcd.txt"
                echo $command
                $(command)
                done
}

最佳答案

使用了多种反模式,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

关于bash - 在 sed 中使用变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48266571/

相关文章:

python - 如何从 bash 脚本中杀死 Django runserver 子进程?

regex - bash 正则表达式 : Search for a maximum of 3 consecutive vowels

regex - 将类似正则表达式的表示法扩展到多个文字

regex - 用 "-"替换所有空格

bash - 将一个文件中的字符串替换为第二个文件的内容

regex - 使用 sed 匹配模式并从该行删除到文件末尾

linux - Unix 命令行 : how to add double quotes to a word?

java - System.getenv() 环境变量存在时返回 null

linux - 获取变量中存储的相对路径的绝对路径

linux - 按特定顺序重命名一组文件而不丢失它们(在 Linux 上)