我需要跨多个文件/子目录更新变量。要替换的变量以相同的 6 个字符开头,此后的所有内容都是随机的。我将使用前 6 个字符作为查找/替换的模式。我将用顺序变量替换后面的随机字符。
我不确定什么实用程序最适合实现此目的,但我想象 sed 在某种循环中?我正在努力想象如何最好地实现这一目标。我想这可以用类似的东西来完成;
#!/bin/bash
i=0
grep -r '/parent/sub/' -e 'pattern' | while read line
do
sed 's/pattern*/pattern$i/g'
((i++))
done
我的第一个问题是我不知道 sed 是否可以这样使用,其次因为它嵌套在循环中,我如何从 grep 命令中向它提供所需的行(或者是否有比 grep 更好的方法在这里使用?)
谢谢
答案1
以下脚本完成这项工作:
#!/bin/bash
i=0
grep -rl --exclude=${0:2} . -e pattern | while read -r line
do
sed -i 's/pattern\(.*\)/pattern'$i'/' "$line"
((i++))
done
该while
循环循环遍历当前目录中包含“模式”实例的所有文件名(并在子文件夹上递归)。使用sed
,您可以替换该行中 'pattern' 之后的所有内容(由 group \(.*\)
、 'pattern' 和 counter 的值指示i
)。
笔记:
- 如果不同行中有许多“模式”字符串,这也适用,但如果同一行中有多个“模式”字符串,则不起作用,因为“模式”后面的所有内容都将被替换。
sed -i
就地替换文件,如果您只想检查它是否正确替换所有内容,请删除-i
.--exclude=${0:2}
我在调用中添加了该选项grep
,因为如果您在当前目录中搜索而不使用它,它也会匹配脚本文件名,因为它包含字符串“pattern”!
答案2
该工具用于寻找文件名为find
,而不是grep
.该工具的名称中有一个很大的线索:-)。grep
是为了G全局找一个右规则的乙文件/流中的表达以及磷打印结果 - 这是ed
命令中的字母g/re/p
。 GNU 的家伙们确实搞砸了,他们提供了grep
查找文件的选项——希望他们接下来不会有任何计划让它承担 sort、tr、sed、wc 等功能!
这是一种稳健地执行您想要的操作的方法(假设您希望 i 何时递增、模式的含义、模式可以包含哪些字符等):
i=0
while IFS= read -rd '' file; do
grep -q 'pattern' "$file" &&
sed -i 's/pattern*/pattern'"$i"'/g' "$file"
((i++))
done < <(find '/parent/sub/' -type f -print0)