![11. 给定一个文件,从第 5 行开始用“ABC”替换所有出现的单词“DEF”,直到仅包含单词“MNO”的那些行结束](https://linux22.com/image/160579/11.%20%E7%BB%99%E5%AE%9A%E4%B8%80%E4%B8%AA%E6%96%87%E4%BB%B6%EF%BC%8C%E4%BB%8E%E7%AC%AC%205%20%E8%A1%8C%E5%BC%80%E5%A7%8B%E7%94%A8%E2%80%9CABC%E2%80%9D%E6%9B%BF%E6%8D%A2%E6%89%80%E6%9C%89%E5%87%BA%E7%8E%B0%E7%9A%84%E5%8D%95%E8%AF%8D%E2%80%9CDEF%E2%80%9D%EF%BC%8C%E7%9B%B4%E5%88%B0%E4%BB%85%E5%8C%85%E5%90%AB%E5%8D%95%E8%AF%8D%E2%80%9CMNO%E2%80%9D%E7%9A%84%E9%82%A3%E4%BA%9B%E8%A1%8C%E7%BB%93%E6%9D%9F.png)
#!/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;}'
这:
- 仅选择从 5 到末尾的行进行操作,代码位于大括号中。
- 然后进一步仅从包含 , 的集合中选择那些行
MNO
,以使用s
ubstitution 命令替换DEF
这些ABC
行。
所有其他行打印不变。
答案2
尝试以下命令
sed –n '10,$p' file1|sed '/MNO/s/ABC/DEF/'