使用顺序变量搜索并替换出现的模式

使用顺序变量搜索并替换出现的模式

我需要跨多个文件/子目录更新变量。要替换的变量以相同的 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)

相关内容