Bash 回显到有特定字符串的行上方的行

Bash 回显到有特定字符串的行上方的行,bash,Bash,我正在使用一个for f in$(cat/dir/file)嵌套循环,其中包含一个条件来测试如果($f=$z)),z位于for z in$(cat/dir/file2)循环中,其中f循环是嵌套的。 我想知道如果$z=$f,是否可以写入$z字符串位于file2中的行上方的行。 file2中的每一行都是一个像07732一样的5位数字,如果file中有一行有07732,我想将该行写在文件2中07732所在行的上方 我现在得到的是 for z in $(cat /dir/file2) do for

我正在使用一个
for f in$(cat/dir/file)
嵌套循环,其中包含一个条件来测试
如果($f=$z))
z
位于
for z in$(cat/dir/file2)
循环中,其中
f
循环是嵌套的。 我想知道如果
$z=$f
,是否可以写入
$z
字符串位于
file2
中的行上方的行。
file2
中的每一行都是一个像07732一样的5位数字,如果
file
中有一行有07732,我想将该行写在文件2中07732所在行的上方

我现在得到的是

for z in $(cat /dir/file2)
do
  for f in $(cat /dir/file)
    do
    if (( $f=$z ))
    then
    (what im asking about)
    i=0
    break
    else
    i=1
    fi
  done
if ((i=1))
then
......
我知道我有语法错误,不需要纠正。
抱歉,如果我解释得很糟糕,请告诉我是否需要更详细地解释

延迟匹配行的输出。而且,正如查尔斯·达菲在一篇推荐文章中指出的那样,不要读带有
for
的行。还请注意,您将为文件1的每一行读取整个文件2。如果文件2的大小很大,那么速度可能会非常慢。如果file2非常小,则将其读入数组

您还应该使用有意义的变量名。这不是20世纪70年代的基础,在这里你只能使用单个字符

下面是一些示例代码,其中包含了大部分内容,但保留了内部while循环,而不是使用数组:

读取文件时1_行
做
当读取-r-u3文件2_行时
做
如果[[$file2\u行==$file1\u行]]
然后
呼应“一些特殊的putput”
i=0
打破
其他的
i=1
fi
完成3
这将回显文件1中的行,但当存在匹配时,它将回显匹配行之前的字符串


内部
while
循环使用,以便在外部循环从STDIN文件描述符读取时能够从第二个文件读取。这样可以同时独立读取多个文件。
-u3
告诉
read
使用文件描述符3。
3延迟匹配行的输出。而且,正如查尔斯·达菲在一篇推荐文章中指出的那样,不要读带有
for
的行。还请注意,您将为文件1的每一行读取整个文件2。如果文件2的大小很大,那么速度可能会非常慢。如果file2非常小,则将其读入数组

您还应该使用有意义的变量名。这不是20世纪70年代的基础,在这里你只能使用单个字符

下面是一些示例代码,其中包含了大部分内容,但保留了内部while循环,而不是使用数组:

读取文件时1_行
做
当读取-r-u3文件2_行时
做
如果[[$file2\u行==$file1\u行]]
然后
呼应“一些特殊的putput”
i=0
打破
其他的
i=1
fi
完成3
这将回显文件1中的行,但当存在匹配时,它将回显匹配行之前的字符串


内部
while
循环使用,以便在外部循环从STDIN文件描述符读取时能够从第二个文件读取。这样可以同时独立读取多个文件。
-u3
告诉
read
使用文件描述符3。
3。相反,请看……是的,一个具有示例输入和预期输出(以及足够完整的代码,其他人可以自己运行它来测试他们的答案,而无需更改任何内容,只需修复狭窄的问题)的示例将是一个很大的帮助。顺便说一句,请记住,UNIX文件系统语义根本不允许您在不重写该内容及其下的所有内容的情况下直接插入文件的一部分内容(通常情况下,会有一些例外情况,但它们需要专门的文件系统,并且只允许您在块对齐的偏移处插入大的块大小的块);除了扩展名,如果不想重写,则只能用完全相同长度的内容替换部分文件。这就是为什么像
sed-i
这样的工具使用您的编辑创建一个全新的临时文件,然后将其重命名为原始文件。您发布的代码与问题的文本不匹配。
$b
$o
来自哪里?。相反,请看……是的,一个具有示例输入和预期输出(以及足够完整的代码,其他人可以自己运行它来测试他们的答案,而无需更改任何内容,只需修复狭窄的问题)的示例将是一个很大的帮助。顺便说一句,请记住,UNIX文件系统语义根本不允许您在不重写该内容及其下的所有内容的情况下直接插入文件的一部分内容(通常情况下,会有一些例外情况,但它们需要专门的文件系统,并且只允许您在块对齐的偏移处插入大的块大小的块);除了扩展名,如果不想重写,则只能用完全相同长度的内容替换部分文件。这就是为什么像
sed-i
这样的工具会用您的编辑创建一个全新的临时文件,然后将其重命名为原始文件。您发布的代码与问题的文本不匹配。
$b
$o
来自哪里?在
(())
中,您需要
=
进行比较<代码>=
分配。@BenjaminW:谢谢,我只是复制/粘贴了OP的代码来修复主要问题,但没有注意到这一点。已修复。
file2
重定向到
fd3
可能需要一句话来解释如何在嵌套的
while
循环中处理两个不同的输入流。(这一部分可能让新的bash用户感到困惑)@DavidC.Rankin:good id