【问题标题】:bash search for string in each line of filebash 在文件的每一行中搜索字符串
【发布时间】:2011-04-17 19:33:20
【问题描述】:

我正在尝试一项看似非常简单的任务:使用 bash 在文件中搜索字符串,如果存在,则将其输出到另一个文件。可能是时差,但这应该可行:

#!/bin/bash

cnty=CNTRY

for line in $(cat wheatvrice.csv); do
    if [[ $line = *$cnty* ]]
    then
        echo $line >> wr_imp.csv
    fi
done

为了完整性,我也试过这个:

#!/bin/bash

cnty=CNTRY

for line in $(cat wheatvrice.csv); do
    case $line in 
    *"$cnty"*) echo $line >> wr_imp.csv;;
    *) echo "no";;
    esac
done

无论该行是否包含 CNTRY,两者都输出所有内容,而且我从看似可靠的来源复制/粘贴,所以显然我缺少一些关于 bash-ness 的简单内容?

【问题讨论】:

  • 对于它的价值,有些行是:
    Brazil,CNTRY-average,1989.428053,0.875353691,2899.968733,531.652993
    这些是我想要的,其他的是
    柬埔寨,Pouthisat,,,3857.124865,122.266868
    这些不是我想要的

标签: bash string file-io


【解决方案1】:

不要使用 bash,使用 grep。

grep -F "$cnty" wheatvrice.csv >> wr_imp.csv

【讨论】:

  • 也许我遗漏了一些东西,但这似乎在 bash 脚本中和直接在终端中都有相同的效果。
  • 使用 grep -F "$cnty"wheatvrice.csv >> wr_imp.csv 简单地将wr_imp.csv中的每一行放入wr_imp.csv
  • 他将它设置为CNTRY,也许你应该明确地使用它。
  • 我真的很抱歉,这只是我困了,让 Excel(也就是我最不喜欢的程序)放错了行尾。赞成并感谢。
  • 不知何故,这次谈话让我哈哈大笑:)
【解决方案2】:

虽然我也建议简单地使用 grep,但问题是开放的,为什么你的方法不起作用。这是对第二种方法的自我引用修改 - 使用关键字“bash”来匹配自身:

#!/bin/bash

cnty=bash    
while read -r line
do
    case $line in 
        *${cnty}*) 
            echo $line " yes" >> bashgrep.log
            ;;
        *)
                echo "no"
                ;;
    esac
done < bashgrep.sh

关键点是while read -r line ... &lt; FILE。您使用 cat 的命令涉及字符串拆分,因此每个单词都在循环中处理,而不是每一行。

示例 1 中的相同问题。

【讨论】:

    猜你喜欢
    • 2016-06-21
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 2018-07-18
    • 2021-03-14
    • 2011-11-19
    相关资源
    最近更新 更多