【问题标题】:Echo to all files found from GREP回显从 GREP 中找到的所有文件
【发布时间】:2020-08-05 05:28:06
【问题描述】:

我的代码有问题。 grep 查找没有“代码”字样的文件 我需要在这些文件中添加“没有”作为最后一行

按逻辑

echo 'doesnt have' >> grep -ril 'code' file/file

我正在使用 -ril 来忽略大小写并获取文件名

有谁知道如何将文本附加到通过 grep 搜索找到的每个 .txt 文件?

【问题讨论】:

  • 您使用了错误的选项,-l 将列出 确实 包含该字符串的文件。你想要大写的-L
  • @Aset :您正在这里创建一个名为 grep 的文件,其中包含文本 doesnt have -ril 'code' file/file 。我不明白你的问题是你想要达到的目标。
  • 同意;完全没有你想要的并且包含奇怪的语法错误的代码不是传达你想要的东西的好方法。

标签: linux bash grep echo


【解决方案1】:

这对于一个新颖的替代品来说怎么样?

echo "doesn't have" |
tee -a $(grep -riL 'code' file/file)

我切换到-L 选项以列出不包含搜索字符串的文件。

不幸的是,这相当脆弱,因为它假定您的文件名不包含空格或其他 shell 元字符。这可以以牺牲一些复杂性为代价来解决(简而言之,让grep 输出以零结尾的匹配项,并将它们读入带有readarray -d '' 的数组。这需要相当新的Bash,并且可能需要GNU grep。)

【讨论】:

    【解决方案2】:

    'echo' 命令可以将输出附加到单个文件,该文件必须通过重定向标准输出来指定。要更新多个文件,需要循环。循环遍历所有用 'grep' 找到的文件

    for file in $(grep -ril 'code' file/file) ; do
        echo 'doesnt have' >> $file
    done
    

    【讨论】:

    • 引用"$file"
    【解决方案3】:

    使用while read loopProcess Substitution

    #!/usr/bin/env bash
    
    while IFS= read -r files; do
      echo "doesn't have" >> "$files"
    done < <(grep -ril 'code' file/file)
    

    正如@dibery 所提到的

    #!/bin/sh
    
    grep -ril 'code' file/file | {
      while IFS= read -r files; do
        echo "doesn't have" >> "$files"
      done
    }
    

    【讨论】:

    • 管道grep输出到while循环,可以避免进程替换。
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 2020-05-02
    • 2022-01-06
    • 2014-03-14
    • 2018-06-26
    相关资源
    最近更新 更多