Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash-使用变量从文件中删除上下两行_Bash_Sed_Vi - Fatal编程技术网

Bash-使用变量从文件中删除上下两行

Bash-使用变量从文件中删除上下两行,bash,sed,vi,Bash,Sed,Vi,我必须构建一个bash脚本,从文件中删除上下两行 脚本向用户询问一个单词,在文件中搜索该单词,并删除4行上行、9行下行和包含该单词的行 以下是有效的命令: vi -e -c 'g/word/.-4,-d' -c 'wq' fileName sed -i '/word/,+9d' fileName 问题是,我想让用户输入一个单词,我将使用它作为变量来完成这一切 下面的代码不起作用 #!/bin/bash read -p "Insert the word:" word v

我必须构建一个bash脚本,从文件中删除上下两行

脚本向用户询问一个单词,在文件中搜索该单词,并删除4行上行、9行下行和包含该单词的行

以下是有效的命令:

vi -e -c 'g/word/.-4,-d' -c 'wq' fileName

sed -i '/word/,+9d' fileName
问题是,我想让用户输入一个单词,我将使用它作为变量来完成这一切

下面的代码不起作用

#!/bin/bash

read -p "Insert the word:" word

vi -e -c 'g/$word/.-4,-d' -c 'wq' fileName

sed -i '/$word/,+9d' fileName

我应该怎么做才能解决这个问题呢?

类似的方法可以解决这个问题,假设搜索词在文件中只出现一次

$ awk -v b=4 -v a=9 -v word="$word" 'NR==FNR{if($0~word) n=NR; next} 
                                     FNR<n-b || FNR>n+a' file{,}
$awk-vb=4-va=9-vword=“$word”'NR==FNR{if($0~word)n=NR;next}
FNRn+a'文件{,}
双击文件,首先查找匹配的行号,第二轮根据前后上下文集打印行


如果找不到搜索词,也不处理。如果要打印所有内容,请添加
!n |
到最后一个条件

您可以使用
vi
ed
一次性完成,无需使用
sed
。单引号内的变量不会被插值,因此需要双引号。有关详细信息,请参阅

vi-e-c'g/'“$word”/-4,+9d'-c'wq'文件名
printf'/%s/\n-4,+9d\nwq\n'$word“| ed-s文件名>/dev/null
我知道的
ed
不足以阻止打印与给定单词匹配的行,因此使用
/dev/null

是否回答了您的问题?