【Shell】shell字符串过滤

服务器进行CppCheck时,需过滤部分文件,如MakeFile、证书文件等。采用字符串过滤方式,将非检测文件过滤掉,文中给出了利用shell字符串过滤的脚本。
Shell字符串过滤
  • 服务器做CppCheck时,需要过滤一些Check的文件。比如MakeFile、证书文件等等。
  • 方式很多,这里采用了字符串过滤,将非检测的文件过滤掉。
  • 过滤check文件脚本
# filter
filter_make_file="Makefile"
filter_pem_file=".pem"
count=-1

# files_array变量包含了所有要检测的文件(过滤前)
for value in ${files_array[@]}
do
# 过滤
if [[ $value =~ $filter_make_file || $value =~ $filter_crt_file ]]
then
continue
fi
count=$[$count+1]
# 将检测文件(过滤后)加入新的数组中
new_files_array[$count]=$value
done

# Now new_files_array contain check file
  • 上述脚本,就是利用了shell字符串过滤。
#!/bin/bash -ex                                                                                                                          
str='MakefileTest'
str1='Makefile' 
# 判断str 是否包含 str1 字符串
if [[ $str =~ $str1 ]];then
	echo "yes"
else
	echo "no"
fi
<think> 我们使用shell脚本来批量修改文件内指定字符串。根据用户之前的提问和引用内容,用户希望使用shell方法(如sed、grep等)来实现。 引用[1]和[2]提供了使用sed和grep结合的方法。我们将参考这些引用,并给出详细步骤。 方法一:使用grep和sed组合(推荐) 步骤: 1. 使用grep递归查找包含旧字符串文件,并列出这些文件路径。 2. 使用sed对每个文件进行字符串替换。 具体命令: grep -rl 'old_string' /path/to/directory | xargs sed -i 's/old_string/new_string/g' 解释: - grep参数: -r 或 -R:递归搜索 -l:只输出包含匹配项的文件名 - xargs:将grep输出的文件名作为参数传递给sed - sed参数: -i:直接修改文件(注意:在Linux中,-i后面可以跟备份扩展名,如-i.bak;如果不想要备份,直接使用-i即可。在Mac中,如果不备份,需要用-i '') 's/old_string/new_string/g':执行替换命令,g表示全局替换 注意:如果路径中有空格,可以使用如下命令(处理带空格的文件名): grep -rl 'old_string' /path/to/directory | xargs -0 sed -i 's/old_string/new_string/g' 这里-0参数告诉xargs使用null字符作为分隔符(grep -Z可以输出以null分隔的记录,但需要grep支持,所以更通用的写法是结合grep的-Z和xargs的-0): grep -rlZ 'old_string' /path/to/directory | xargs -0 sed -i 's/old_string/new_string/g' 方法二:使用find和sed组合 如果不想用grep,也可以使用find来查找文件,然后使用sed替换。 find /path/to/directory -type f -exec sed -i 's/old_string/new_string/g' {} + 但是这种方法会尝试替换所有文件,而不管文件是否包含旧字符串。我们可以先通过grep过滤出包含旧字符串文件,然后再用sed替换(即方法一)。 方法三:使用sed的备份(Mac系统) 在Mac上,sed的-i选项要求提供一个备份扩展名。如果不需要备份,可以提供一个空字符串。 grep -rl 'old_string' /path/to/directory | xargs sed -i '' 's/old_string/new_string/g' 注意事项: 1. 操作前备份:在进行批量替换前,建议备份整个目录。 2. 特殊字符处理:如果old_string或new_string中包含特殊字符(例如/、$、*等),需要进行转义。 例如,如果旧字符串是“path/to”,那么替换时应该写:'s/path\/to/new_path/g' 或者使用其他分隔符(如s|path/to|new_path|g)。 3. 测试:先在不加-i的情况下运行sed命令,查看替换效果。例如: sed 's/old_string/new_string/g' filename 或者只对单个文件进行替换测试。 示例:将当前目录及子目录下所有文件中"hello"替换成"world" grep -rl 'hello' . | xargs sed -i 's/hello/world/g' 引用[1][2]的方法提供了类似思路。 针对用户可能的后续问题,我们生成相关问题如下: </think> ### 使用 Shell 批量修改文件内指定字符串的方法 以下是基于引用内容的 **3 种实用方法**,通过 `grep` + `sed` 组合实现安全高效的批量替换: --- #### 方法 1:直接替换指定目录的文件(推荐) ```bash # 递归替换当前目录及子目录所有文件 grep -rl 'old_string' . | xargs sed -i 's/old_string/new_string/g' ``` - **原理**: - `grep -rl`:递归 (`-r`) 搜索包含 `old_string` 的文件,输出文件名 (`-l`) - `xargs`:将文件名传递给 `sed` - `sed -i`:直接修改文件内容(`s/old/new/g` 全局替换) - **示例**:替换所有文件中 `apple` 为 `orange` `grep -rl 'apple' . | xargs sed -i 's/apple/orange/g'` ✅ 仅修改包含目标字符串文件 **[高效安全]** [^1][^2] --- #### 方法 2:指定文件类型替换 ```bash # 仅替换 .txt 文件 grep -rl --include='*.txt' 'old_string' . | xargs sed -i 's/old_string/new_string/g' ``` - **关键参数**: - `--include='*.txt'`:限定文件扩展名 - 支持多类型:`--include='*.{txt,js,html}'` - **示例**:替换所有 `.js` 文件中的 `var` 为 `let` `grep -rl --include='*.js' 'var' . | xargs sed -i 's/var/let/g'` --- #### 方法 3:创建备份后替换(防误操作) ```bash # 替换前备份原文件(生成 .bak 备份) grep -rl 'old_string' . | xargs sed -i.bak 's/old_string/new_string/g' ``` - **优势**: - 自动生成 `filename.bak` 备份文件 - 支持撤销:`find . -name "*.bak" -exec rename 's/\.bak$//' {} \;` --- ### 📌 关键注意事项 1. **特殊字符转义**: - 若字符串含 `/` 或正则符号,改用其他分隔符: ```bash sed -i 's|old/string|new_string|g' file.txt ``` 2. **Mac 系统兼容**: ```bash # Mac 需额外空参数处理备份 grep -rl 'old_string' . | xargs sed -i '' 's/old_string/new_string/g' ``` 3. **安全验证步骤**: ```bash # 1. 预览受影响文件 grep -r 'old_string' . # 2. 测试单个文件 sed 's/old_string/new_string/g' demo.txt ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值