【问题标题】:how to read line by line from file in bash script?如何从bash脚本中的文件逐行读取?
【发布时间】:2011-12-18 22:22:29
【问题描述】:

我在网上搜索过这个问题,目前找到了两种方法:

   while read line; do
      commands
   done < "$filename"

和

    for $line in $(cat $filename); do
       commands
    done

如果行有空格,这些都不起作用,例如,如果我们有这样的行

  textextext text

它不会打印textextext text

但是

  textextext
  text

它把这些东西算作不同的线,我怎样才能避免这种情况发生?

【问题讨论】:

  • 您是否对 a) 前导和尾随空格或 b) 中间空格(例如多个空格)或 c) 仅对一行中的单词感兴趣?

标签: file bash scripting line


【解决方案1】:

像这样?

while IFS= read line ; do
   something "$line"
done <"$file"

这是一个简短的测试:

while IFS= read line ; do echo "$line"; done <<<"$(echo -e "a b\nc d")"
a b
c d

【讨论】:

  • 这不是我发布的相同内容吗?我认为如果该行有空格,这将不起作用
  • 清空输入字段分隔符。我刚刚更新了我刚刚进行的测试的帖子。
  • 感谢它现在工作得很好,我在第一次测试时犯了一个错误
  • 另一个关键差异是在 ${line} 变量周围添加 dbl 引号。祝你好运。
  • 您可能需要添加 -r 选项以按照 stackoverflow.com/a/10929955/770191 进行读取
【解决方案2】:

你可以读数组(bash 4+)

readarray lines < "$file"

然后

for line in "${lines[@]}"; 
do
    echo "$line"
done

请注意,默认情况下readarray 甚至会包含每一行的行尾字符

【讨论】:

  • readarray 的“-t”参数将“从读取的每一行中删除一个尾随换行符。”
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多