![用条件替换多个文件(同一目录)中的字符串](https://linux22.com/image/154142/%E7%94%A8%E6%9D%A1%E4%BB%B6%E6%9B%BF%E6%8D%A2%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%88%E5%90%8C%E4%B8%80%E7%9B%AE%E5%BD%95%EF%BC%89%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
例子:
文件1:
Name: abc
Number: 325
Code: 0
文件2:
Name: xyz
Number: 578
Code: 0
文件3:
Name: ttt
Number: 356
Code: 0
文件4:
Name: nnn
Number: 228
Code: 0
文件5:
Name: bnb
Number: 434
Code: 0
问题是如何改变代码到1但前提是数字是3xx或者2xx。所以File2和File5保持不变。
文件有很多行,大约有 100 个文件,但这只是简化的示例,如何替换文件中的一个字符串(第 x 行),但前提是该文件中的其他字符串(第 y 行)相对应。
答案1
这应该可以完成这项工作:
sed -i 's/^Code: 0$/Code: 1/' $(grep -l '^Number: [23]' File*)
- 该
sed
部件进行实际替换 - 该
grep -l ... File*
部分列出了名称与“File*”匹配且行以 或 开头的所有Number: 2
文件Number: 3
$(...)
围绕命令的构造grep
是命令替换将把列出的文件grep
送入sed
答案2
使用 GNU 工具:
grep -lxZ 'Number: [23]..' ./File* |
xargs -r0 sed -i 's/^Code: 0$/Code: 1/'
答案3
假设数字总是先于代码, 和代码可能有任何价值,然后使用sed
:
sed -i '/^Number: [23]/{n;s/^Code: .*$/Code 1/}' File*
如果内容一致,那么后面的行数字总是代码0,可以简化为:
sed -i '/^Number: [23]/{n;s/0/1/}' File*
答案4
不使用sed执行此任务时无需创建临时文件,因为重定向回源会破坏文件的内容。相反,使用编辑。
我假设文件名在 [a-zA-Z0-9_-] 范围内
% cat scr.ed
1,$s/Code: 0/Code: 1/
w
q
% cat scr.sh
#!/bin/sh
for file in `grep -l '^Number: [23]' File*`
do
ed -s $file <scr.ed
done
% chmod 755 scr.sh
% ./scr.sh