【问题标题】:shell script for counting replacements用于计算替换的 shell 脚本
【发布时间】:2015-06-22 21:26:43
【问题描述】:

位于一个目录中的十个文件。每个文件内容都有“苹果”字样。编写一个 bash shell 脚本,将所有十个文件中的“apple”替换为“banana”,并打印每个文件的替换次数。已经尝试过这种方式,但不知道如何获得更换数量。有人可以帮忙吗?并且 sed 只是在显示实际文件中修改而不被修改

#!/bin/bash 
for f in *.txt 
do sed 's/apple/banana/g' $f 
done

【问题讨论】:

  • 当您说“shell 脚本”时,您的意思是 bash、ksh 还是其他?也许添加相关标签。另外,您要解决的真正问题是什么?一些上下文可能很好,因为这听起来像是家庭作业。
  • 不要在 cmets 中使用代码。相反,edit 你的问题显示它。
  • 你的问题不是很清楚。当您说“每个文件都有“苹果”字样时。你的意思是文件名还是它的内容?我的直觉告诉我这可能是内容,但我们需要确定,因为每种解释都需要非常不同的解决方案
  • 文件内容不是文件名

标签: bash replace count


【解决方案1】:

假设您想在文件的内容中而不是在文件的名称中将单词“apple”替换为“banana”(完全匹配)(请参阅我上面的评论)并且您正在使用bash shell:

#!/bin/bash

COUNTER=0

    for file in *.txt ; do
        COUNTER=$(grep -o "\<apple\>" $file | wc -l)
        sed -i 's/\<apple\>/banana/g' $file
        echo "RESULT: $COUNTER replacements in file $file"
        let COUNTER=0
    done

exit 0;

解释:

  • 要计算每个文件的替换次数,您可以使用 grep 和 -o 标志来打印与您要替换的单词的所有匹配项(每个都在一个新行中)并将结果通过管道传送到 wc -l(这很重要)换行符)。结果存储在一个变量中,该变量打印在屏幕上,然后在处理完每个文件后重置。
  • 如果您希望 sed 在文件中实际执行替换,则必须指定 -i 标志,否则将在标准输出上执行替换。
  • 此脚本只会替换单词“apple”的完全匹配。因此,例如,单词“apples”将不会替换为“bananas”。如果您想要不同的行为,只需删除单词“apple”周围的单词分隔符(单词分隔符为\&lt; 和\&gt;)。

【讨论】:

  • 任何可用于练习“sed”和“awk”命令的链接请张贴链接
  • @Bubbles 如果这对您有用,请点赞并点击左侧的勾号接受它。至于练习“sed”和“awk”命令,除了文档本身,这些是我能找到的最好的教程和最佳参考:grymoire.com/Unix/Sed.htmlgrymoire.com/Unix/Awk.html
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 2018-02-01
相关资源
最近更新 更多