【问题标题】:Multiple greps and sed in file with pipes多个 greps 和 sed 在文件中使用管道
【发布时间】:2021-11-02 09:58:57
【问题描述】:

我想在文件中查找一个字符串并用某物替换,但是下面的命令不起作用。

$ grep "CUDA_ARCH" lib/gpu/Makefile.linux | grep -v "#CUDA_ARCH" | grep -v " CUDA_ARCH " | xargs sed -i 's/sm_.*/sm_86/g'
sed: invalid option -- 'a'
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...

以下命令正确

$ grep "CUDA_ARCH" lib/gpu/Makefile.linux | grep -v "#CUDA_ARCH" | grep -v " CUDA_ARCH "
CUDA_ARCH = -arch=sm_50
$ grep "CUDA_ARCH" lib/gpu/Makefile.linux | grep -v "#CUDA_ARCH" | grep -v " CUDA_ARCH " | sed 's/sm_.*/sm_86/g'
CUDA_ARCH = -arch=sm_86
$ grep "CUDA_ARCH" lib/gpu/Makefile.linux
#     - Change CUDA_ARCH for your GPU
#CUDA_ARCH = -arch=sm_30
#CUDA_ARCH = -arch=sm_32
#CUDA_ARCH = -arch=sm_35
#CUDA_ARCH = -arch=sm_37
CUDA_ARCH = -arch=sm_50
#CUDA_ARCH = -arch=sm_52

我该如何解决这个问题?

【问题讨论】:

    标签: bash sed grep


    【解决方案1】:

    这是您的错误的简化示例:

    $ echo 'abc -a xyz' | xargs sed 's/abc/123/'
    sed: invalid option -- 'a'
    
    # if - isn't present in the stdin data, you might get file errors
    $ echo 'abc a xyz' | xargs sed 's/abc/123/'
    sed: can't read abc: No such file or directory
    sed: can't read a: No such file or directory
    sed: can't read xyz: No such file or directory
    
    # you can remove xargs, but then you'll not be able to use -i
    $ echo 'abc -a xyz' | sed 's/abc/123/'
    123 -a xyz
    

    试试这个(将ip.txt 替换为lib/gpu/Makefile.linux)。如果可行,请使用-i 选项。

    $ cat ip.txt
    #CUDA_ARCH = -arch=sm_50
     CUDA_ARCH = -arch=sm_50
    CUDA_ARCH = -arch=sm_50
    
    $ sed -E '/(^|[^# ])CUDA_ARCH/ s/sm_.*/sm_86/' ip.txt
    #CUDA_ARCH = -arch=sm_50
     CUDA_ARCH = -arch=sm_50
    CUDA_ARCH = -arch=sm_86
    

    sed支持过滤,这里不用grep

    /(^|[^# ])CUDA_ARCH/ 将匹配行首的CUDA_ARCH,或者如果它前面没有# 或空格字符。

    对于这样的行,将应用替换命令。

    如果单个正则表达式不起作用并且您需要多个条件,则可以使用 /regexp1/ { /regexp2/ {stmts} } 之类的内容。使用/regexp/! 反转条件。

    【讨论】:

    • 好的。我使用-Ei 对文件进行更改。但是 -i 单独不起作用,这很奇怪。
    • GNU sed 无需参数即可使用-i 选项,但其他实现(如 BSD)则不会。见stackoverflow.com/questions/5694228/…
    猜你喜欢
    • 2014-08-31
    • 2014-03-18
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2021-03-14
    相关资源
    最近更新 更多