用条件替换多个文件(同一目录)中的字符串

用条件替换多个文件(同一目录)中的字符串

例子:

文件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

相关内容