Linux Grep Bash脚本中没有这样的文件或目录错误,我应该插入Wait命令吗?

Linux Grep Bash脚本中没有这样的文件或目录错误,我应该插入Wait命令吗?,linux,bash,shell,sed,grep,Linux,Bash,Shell,Sed,Grep,我正在运行一个运行良好的脚本。然而,昨天,我犯了几个错误这些错误发生在脚本的几个循环之后: sed: cant read file3.txt: No such file or directory grep: file3.txt: No such file or directory grep: file3.txt: No such file or directory sed: cant read file3.txt: No such file or directory grep: file3.tx

我正在运行一个运行良好的脚本。然而,昨天,我犯了几个错误这些错误发生在脚本的几个循环之后:

sed: cant read file3.txt: No such file or directory
grep: file3.txt: No such file or directory
grep: file3.txt: No such file or directory
sed: cant read file3.txt: No such file or directory
grep: file3.txt: No such file or directory
请记住,这些错误不会一直发生。它偶尔会在脚本的这一部分附近发生一次File3.txt是找不到的文件:

cat file1.txt | while read LINE; do grep -m 1 $LINE file2.txt >> file3.txt; done
sed -i 's/string//g'  file3.txt
grep 'string' file3.txt | cut -d '|' -f1-2 > file4.txt
grep -v 'string' file3.txt | cut -d '|' -f1-2 >> file5.txt
sed -i 's/string//' file3.txt
grep -Fvf file3.txt file1.txt > file6.txt
现在,我在想,既然file3.txt被追加,或者以后由SED操作,有时候下一个命令启动得太快,它找不到文件?我应该在两者之间放置一个等待命令吗

我已查找了许多有此错误的页面,但找不到任何内容:


如果您认为发出等待或睡眠命令会有所帮助,请告诉我。或者,如果你认为有更好的解决方案,那也太好了。我在Cygwin终端上运行。非常感谢您的任何见解

如果file1.txt为空,则不会创建file3.txt。

如果file1.txt为空,则不会创建file3.txt。

而不是在
循环中重定向到
file3.txt
,而是重定向整个循环。然后,即使循环从未运行,也会创建该文件,因为输入文件为空

while read LINE; do 
    grep -m 1 $LINE file2.txt
done < file1.txt > file3.txt
读行时
;做
grep-m 1$LINE file2.txt
完成file3.txt

循环中重定向整个循环,而不是重定向到
文件3.txt
。然后,即使循环从未运行,也会创建该文件,因为输入文件为空

while read LINE; do 
    grep -m 1 $LINE file2.txt
done < file1.txt > file3.txt
读行时
;做
grep-m 1$LINE file2.txt
完成file3.txt

还有
do grep-m 1$LINE file2.txt如果有关键字符(空格是最容易的字符),则会导致问题。
假设
$LINE
变量包含多个由空格分隔的单词:
hello world

现在命令看起来是这样的:
grep-m1 hello world file2.txt
-grep解释看起来是这样的:让我们在名为
world
的文件中找到所有
hello
,并在当前文件夹中找到名为
file2.txt
的文件

使用
“$LINE”
而不是
$LINE
将导致您进入一个完全不同的场景。
请看以下两种方法之间的区别:

grep -m 1 $LINE file2.txt
grep -m 1 "$LINE" file2.txt

另外,
do grep-m 1$LINE file2.txt如果有关键字符(空格是最容易的字符),将导致问题。
假设
$LINE
变量包含多个由空格分隔的单词:
hello world

现在命令看起来是这样的:
grep-m1 hello world file2.txt
-grep解释看起来是这样的:让我们在名为
world
的文件中找到所有
hello
,并在当前文件夹中找到名为
file2.txt
的文件

使用
“$LINE”
而不是
$LINE
将导致您进入一个完全不同的场景。
请看以下两种方法之间的区别:

grep -m 1 $LINE file2.txt
grep -m 1 "$LINE" file2.txt

你打算在第一个“sed”的文件名中留一个空白吗?每当我看到一大堆临时文件,有grep和sed的多种用法时,我就会想到awk。我不知道为什么你所得到的不起作用,但我几乎可以肯定的是,你所尝试做的可以简化为一个单独的awk脚本。如果您向我们显示您的输入和所需的输出,那么我们可以更有效地帮助您。如果
file1.txt
始终为空,则不会创建
file3.txt
。我认为等待或睡眠不会有帮助。命令不应“过早启动”。我将在file1.txt中查找一些在作为$LINE插入grep命令时应该转义的内容。我想您的file3.txt没有被创建是因为引号、分号或其他原因。很高兴我能帮上忙。bmb的观察结果也应该得到解决,即使它现在没有造成问题。我想它可能会说
grep-F-m1“$LINE”…
您打算在第一个“sed”的文件名中留一个空白吗?每当我看到一大堆临时文件,有grep和sed的多种用法时,我就会想到awk。我不知道为什么你所得到的不起作用,但我几乎可以肯定的是,你所尝试做的可以简化为一个单独的awk脚本。如果您向我们显示您的输入和所需的输出,那么我们可以更有效地帮助您。如果
file1.txt
始终为空,则不会创建
file3.txt
。我认为等待或睡眠不会有帮助。命令不应“过早启动”。我将在file1.txt中查找一些在作为$LINE插入grep命令时应该转义的内容。我想您的file3.txt没有被创建是因为引号、分号或其他原因。很高兴我能帮上忙。bmb的观察结果也应该得到解决,即使它现在没有造成问题。我认为它应该说
grep-F-m1“$LINE”…
Hey Barmar,好的观点,这也将有助于解决这个问题。谢谢你的回答。希望你喜欢这个问题。嘿,巴尔马,说得好,这也会有助于解决这个问题。谢谢你的回答。希望你喜欢这个问题。