gpt4 book ai didi

bash - 使用 sed 在大量文件中搜索特定字符串并替换它

转载 作者:行者123 更新时间:2023-12-04 05:15:55 26 4
gpt4 key购买 nike

我想要做的是搜索大量源文件以查找特定模式,并在此模式中放入另一个表达式。我正在查找的文件都具有相同的扩展名 *.F90。
我的第一步是使用 grep 并找到那些包含分配但未分配的文件的所有行,所以我有:

grep –I “ allocate *(” *.F90 | grep –v allocated

我遇到的第一个问题是括号前面可能有一个或多个空格。我可以有
 allocate( 
or allocate (
or allocate (

这就是为什么我在 grep 命令中需要“*”的原因。
然而,一般规则(除了空格)说分配后跟“(”,然后是正在分配的东西。所以我有:
allocate ( array_name ( .... 

空格是可选的
所以我想做的是找到这个字符串,并在它前面放置以下内容:
If( allocated(array_name) ) deallocate(array_name)

在下一行之后,我想要原始字符串 allocate(array( … .
请注意,array_name 是一个字母数字字符串,替换后出现在多个地方。它是被分配的阵列的名称。
如果有人能给我一个提示如何做到这一点,我将不胜感激。我被卡住了,不知道该怎么做。

最佳答案

我假设您的意思是要替换 allocate ( array_name )If( allocated(array_name) ) deallocate(array_name) allocate ( array_name ) .

在 GNU 或 BSD sed 中,您可以执行以下操作:

sed -i.bk -e '/allocated/t' \
-e 's/allocate *( *\([A-Za-z0-9_]*\) *)/If( allocated(\1) ) deallocate(\1) &/' \
*.F90

这将搜索和替换 *.F90 中的匹配行,并用 allocated 跳过行上。原始文件将被称为 *.F90.bk。

正如@Anders Johansson 提到的,在其他情况下,分配的参数不是字母数字下划线,那么您可以在搜索和替换之前搜索它:
for i in *.F90; do
echo "$i"
sed -n '/.*allocate *( *\([^ )]*\) *).*/{h; s//\1/; /^[A-Za-z0-9_]*$/t
x; p;}' "$i"
done

(注意 t 之后的换行符,BSD sed 将 t 之后的所有内容都解释为标签)。在 bash 中按 ctrl+v ctrl+j 在命令行输入换行符。
  • /a\(b\)c/查找具有匹配字符串的行
  • h *h*old 比赛 abc进入货舱
  • s//\1/ *s*替换最后一场比赛abc与第一组b
  • /^[a-z]*$/t 如果 b匹配 ^[a-z]*$ ,然后分支到脚本结尾
  • x e*x*change 保留空间 abc一个模式空间b
  • p *p*rint 模式空间 b
  • 关于bash - 使用 sed 在大量文件中搜索特定字符串并替换它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14268170/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com