【问题标题】:Why does outer while loop in Bash not finishing?为什么 Bash 中的外部 while 循环没有完成?
【发布时间】:2018-02-20 15:49:50
【问题描述】:

我不明白为什么这个外循环仅仅因为内循环可以完成而退出。

$1 指的是具有大量模式/替换行的文件。 $2 是一个单词列表。问题是外部循环已经在第一个模式/替换行之后退出。我希望它在读取$1 中的所有行后退出。

#!/bin/bash

#Receive SED SCRIPT WORDLIST 

if [ -f temp.txt ];
then 
    > temp.txt
else
    touch temp.txt
fi

while IFS='' read -r line || [[ -n "$line" ]];
do
    echo -e "s/$line/p" >> temp.txt

    while IFS='' read -r line || [[ -n "$line" ]];
    do
        sed -nf temp.txt $2
    done
        > temp.txt
done < $1        

【问题讨论】:

  • 您不需要 bashsed 的组合来完成这项工作。只需给我们所需的预期输入和输出
  • 目前还不清楚当前脚本产生了什么错误行为。
  • 对同一输入流的第二次 read 调用将读取第二行,并且不会像您打算做的那样
  • 感谢 Inian,该解决方案的灵感来自您最后的评论。我实际上不需要第二个 while 循环 :-)
  • 我很确定这是重复的。如果您尝试从文件中读取一堆模式并使用它们在另一个文件中执行替换,请参见例如stackoverflow.com/questions/35253663/…

标签: bash


【解决方案1】:

我了解您想计算 de sed 表达式并将其写入文件,然后将此表达式应用于其他文件。

这比你做的要容易得多。

首先,您不需要检查 temp.txt 是否已经存在。当您将命令的输出重定向到文件时,如果该文件不存在,则会创建该文件。但是如果你想重置文件,我建议你使用 truncate 命令。

在脚本正文中,我不明白您为什么要放置第二个 while 循环来读取文件,但您没有放置要读取的文件。

我认为你需要的是这样的:

truncate -s 0 sed_expressions.txt

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo -e "s/$line/p" >> sed_expressions.txt
done < $1
sed -nf sed_expressions.txt $2 > out_file.txt

试试看,告诉我这是不是你需要的。

再见!

【讨论】:

  • 谢谢 A,关于第二个 while 循环,我得出了相同的结论。之前没学过 truncate 命令,谢谢分享。这看起来效率更高。
  • 我很高兴。如果这就是您所需要的,请将我的答案标记为正确以关闭此问题。
猜你喜欢
  • 2020-07-09
  • 1970-01-01
  • 2019-07-03
  • 2016-09-13
  • 1970-01-01
  • 2012-12-09
  • 2016-03-13
  • 2019-09-16
  • 2015-08-15
相关资源
最近更新 更多