我想将所有文件中的“Aux Power [A]”替换为“aux_power”。仅可以修改带有“Aux Power [A]”的文件,其余文件保持不变。
我努力了
grep -lR "Aux Power [A]" /mnt/d/power/jan/output | xargs sed -i "s/'Aux Power [A]'/'aux_power_w'/g"
但它似乎不起作用。
请指教。
答案1
您的代码存在双重问题:
默认情况下,该
grep
命令需要正则表达式模式,而不是字符串,并且您的字符串包含正则表达式特有的字符([
和]
)。您在替换时也遇到同样的问题sed
。输出的文件名
grep -l
可能被损坏。如果文件包含不可打印的字符(例如换行符),grep
则只需将其从输出名称中删除。这意味着sed
不会对该文件调用。
这是假设您想要替换文件内容中的字符串,而不是文件名中的字符串:
/mnt/d/power/jan/output
要查找包含确切字符串的目录下的所有文件Aux Power [A]
,您可以使用
find /mnt/d/power/jan/output -type f \
-exec grep -Fq 'Aux Power [A]' {} ';' -print
要将字符串更改为aux_power
您可以像这样扩展该命令:
find /mnt/d/power/jan/output -type f \
-exec grep -Fq 'Aux Power [A]' {} ';' \
-exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'
这是假设 GNU sed
。
不会grep -Fq
产生任何输出,但将为包含指定字符串(不是正则表达式,因为-F
使用了)的任何文件返回零退出状态。
该sed
命令进行就地编辑(GNU 方式),更改所有出现的字符串(此处指定为正则表达式,这就是括号被转义的原因)。
如果您想获取终端中列出的已修改文件的名称,请-print
在find
.-exec grep ... {} ';'
由于sed
我们在这里使用的表达式不会更改不包含您要更改的特定字符串的文件的内容,因此您可以将命令缩短为
find /mnt/d/power/jan/output -type f \
-exec sed -i 's/Aux Power \[A\]/aux_power/g' {} ';'
这将替换应用于全部目录下的文件/mnt/d/power/jan/output
。任何不包含该字符串的文件将保持不变(但其时间戳仍会更新)。
答案2
您应该转义 grep 的方括号。 “[A]”与“A”相同。尝试
grep -lR "Aux Power \[A\]" /mnt/d/power/jan/output | xargs sed -i "s/Aux Power \[A\]/aux_power_w/g"