11. 给定一个文件,从第 5 行开始用“ABC”替换所有出现的单词“DEF”,直到仅包含单词“MNO”的那些行结束

11. 给定一个文件,从第 5 行开始用“ABC”替换所有出现的单词“DEF”,直到仅包含单词“MNO”的那些行结束
#!/bin/sh

counter=5
string="MNO"
while [ $counter -gt 0 ]
do
        for item in /Users/kristinautas/Desktop/DEFABC.txt
        do
                if [[ $(gsed $counter DEFABC.txt)=*string* ]]; then
                        gsed -i "$counter s/DEF/ABC/g" "DEFABC.txt"
                        counter=$(($counter+1))
                fi
        done
done

我能够将“DEFABC.txt”文件中从第 5 行开始的所有“DEF”字符串替换为“ABC”字符串。但是,当我尝试使用 if 语句添加另一个条件(仅当该行包含“MNO”字符串时才替换)时,脚本仍然替换第 5 行之后的所有出现情况。我做错了什么?

答案1

sed 可以自己完成此操作:

sed -e '5,${/MNO/s/DEF/ABC/g;}'

这:

  1. 仅选择从 5 到末尾的行进行操作,代码位于大括号中。
  2. 然后进一步仅从包含 , 的集合中选择那些行MNO,以使用substitution 命令替换DEF这些ABC行。

所有其他行打印不变。

答案2

尝试以下命令

sed –n '10,$p' file1|sed '/MNO/s/ABC/DEF/'

相关内容