bash - 多个 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
我该如何解决?
解决方案
这是您的错误的简化示例:
$ 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/!
反转条件。
推荐阅读
- git - gitlab-ci 中的增量更新
- java - 如何在 CSV 中添加由 Java 中的数据组成的列
- r - R save() 不产生任何输出但没有错误
- php - Laravel 迁移:无法添加外键约束
- python - 与 Numpy Array 相比,Numpy 矩阵内存大小低
- google-app-maker - 如何暂停应用程序制造商部署?
- vba - VBA - 基于附件文件名移动电子邮件
- visual-studio - Unity - 如何开始处理大型地形/地图?
- f# - F# 中 Z3 的 InvalidCastException
- flutter - 如何在 ListView 中重叠项目?