首页 > 解决方案 > 多个 greps 和 sed 在文件中使用管道

问题描述

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

$ 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

我该如何解决?

标签: bashsedgrep

解决方案


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

$ 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.txtlib/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/!反转条件。


推荐阅读