代码之家  ›  专栏  ›  技术社区  ›  artemis Roberto

使用sed替换多个文件中的同一文本行

  •  2
  • artemis Roberto  · 技术社区  · 6 年前

    在我当前的目录(projDir)中,我有大约41个文件夹,如下所示:

    • ProgOneDir公司
    • ProgTwoDir公司
    • ProgThreeDir公司
    • ...
    • ProgFortyOneDir公司

    …等等(我没有提出命名方案,我不是一个系统管理员,所以请不要为他们对我大喊大叫)。

    在每个子文件夹中,都有需要编辑的README.md文件。我不想进入每个子文件夹并编辑那里的文件,而是想使用sed命令来完成。这些文件始终命名为README.md

    我在运行CentOS7

    我现在的命令是:

    find . -name 'README.md' -exec sed -i -e 's/./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib"/./makeprog/g' {} \;
    


    ./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib
    

    ./makeprog
    

    有人能帮忙吗?我得到的错误是:

    sed: -e expression #1, char 43: unknown option to `s'
    

    sed: -e expression #1, char 110: unterminated `s' command
    

    非常感谢。

    1 回复  |  直到 6 年前
        1
  •  6
  •   glenn jackman    6 年前

    s/// 命令,但您正在向模式中添加斜杠。您可以选择不出现在模式中的其他分隔符。

    sed -i -E 's#(./makeprog) .*#\1#' */README.md
    

    perl -i -e 's{./makeprog\K.*}{}' */README.md
    

    如果要特别匹配该行,则:

    # are you missing a trailing double quote?
    line='./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib'
    sed -i -E "s#$line#./makeprog#" */README.md