【问题标题】:Bash - Remove upper and lower lines from file using variables [duplicate]Bash - 使用变量从文件中删除上下行[重复]
【发布时间】:2021-07-30 03:21:02
【问题描述】:

我必须构建一个 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

我应该怎么做才能解决它?

【问题讨论】:

标签: bash sed vi


【解决方案1】:

vied 可以一次性完成,无需使用sed。单引号内的变量不会被插值,你需要双引号。详情请见Difference between single and double quotes in Bash

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

printf '/%s/\n-4,+9d\nwq\n' "$word" | ed -s fileName > /dev/null

我不知道ed 足以阻止打印与给定单词匹配的行,因此使用/dev/null

【讨论】:

    【解决方案2】:

    这样的事情会起作用,假设搜索词在文件中只出现一次

    $ 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{,}
    

    双重扫描文件,首先找到匹配的行号,第二轮根据前后上下文设置打印出行。

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

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 2022-01-19
      • 2013-11-29
      • 2018-06-16
      • 2012-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-12
      相关资源
      最近更新 更多