【问题标题】:How to Find & Replace a String Within Files with Find / Grep / Sed如何使用 Find / Grep / Sed 在文件中查找和替换字符串
【发布时间】:2020-11-15 19:04:44
【问题描述】:

我有一个包含 500 个 *.INI 文件的文件夹,我需要手动编辑这些文件。在每个 INI 文件中,我都有 Source = 行。我希望那条线变成Source = C:\software\{filename}

例如,需要将 dx4.ini 文件修复为:Source = C:\software\dx4

有没有使用 Find、Grep 或 Sed 函数的快速方法?

【问题讨论】:

  • 请添加您尝试过的内容,如果对这一切完全陌生,我建议您通过unix.stackexchange.com/questions/112023/…,如果您遇到的命令卡住了,请在这里提问试过
  • 这可能对bash有帮助:for filename in *.INI; do base="${filename%*.INI}"; echo "$base $filename"; done
  • 关于您编辑内容的愿望:不要。创建一个新目录并使用数据写入新文件。该过程完成并经过验证后,删除旧目录树。尝试直接编辑文件绝对不会给您带来任何好处,并且会带来不必要的数据损坏风险。

标签: sed grep find


【解决方案1】:
find *.ini -type -f > stack

while read line 
do
sed -i s"@Source =@Source = C:\\software\\dx4@" "${line}"
done < stack

假设 a} 您已经使用“-i”(插入标志,AFAIK 并不总是可移植的)并且 b} sed 不会对双转义序列自欺欺人,我认为这会起作用。

【讨论】:

    【解决方案2】:

    使用 GNU awk 将第三个参数用于 match()、gensub() 和“就地”编辑:

    awk -i inplace '
        match($0,/(.*Source = C:\\software\\){filename}(.*)/,a) {
            fname = gensub(/\..*/,"",1,FILENAME)
            $0 = a[1] fname a[2]
        }
    1' *.INI
    

    以上假设您在 UNIX 环境中运行,尽管您使用术语 folder 而不是 directory 并且以 C: 开头并包含反斜杠的路径让我怀疑。如果您在 Windows 上,则将 2 's(不包含)之间的部分保存在名为 foo.awk 的文件中,并将其作为 awk -i inplace foo.awk *.INI 执行,或者您通常在 Windows 中执行这样的命令。

    【讨论】:

      【解决方案3】:

      如果您想编辑脚本中的文件,我认为ed 是要走的路。结合shellfor循环:

      for file in *.INI; do
          base=$(basename "$file" .INI)
          ed -s "$file" <<EOF
      /^Source =/s/=/= C:\\\\software\\\\$base/
      w
      EOF
      done
      

      (这确实假设文件名的名称中没有换行符或与号)

      【讨论】:

        【解决方案4】:

        你可以试试 sed 例如

        输入文件内容: 文件.txt

        Source =
        some lines..
        

        脚本:

        newstring='Source = C:\software\dx4'
        oldstring='Source ='
        echo `sed "s/$oldstring/$newstring/g" file.txt` > file.txt
        

        运行上述命令后 输出:

        Source = C:\software\dx4
        some lines..
        

        【讨论】:

        • 我建议删除 echo 和两个反引号。
        猜你喜欢
        • 1970-01-01
        • 2011-09-04
        • 2014-01-13
        • 2018-02-24
        • 2017-05-14
        • 1970-01-01
        • 2013-04-01
        • 2019-11-29
        • 2013-03-23
        相关资源
        最近更新 更多