首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed:如何删除被注释行限制的文件中的行范围?

sed:如何删除被注释行限制的文件中的行范围?
EN

Stack Overflow用户
提问于 2020-05-09 16:03:05
回答 2查看 35关注 0票数 0

示例文件:

代码语言:javascript
复制
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1   localhost
255.255.255.255 broadcasthost
::1             localhost
# Added by Docker Desktop
# To allow the same kube context to work on the host and the container:
127.0.0.1 kubernetes.docker.internal
# End of section
# <docker-registry>
docker.local 127.0.0.1
# </docker-registry>

使用sed (https://unix.stackexchange.com/a/236754)的范围表达式特性,我想删除以下行:

代码语言:javascript
复制
# <docker-registry>
docker.local 127.0.0.1
# </docker-registry>

经过十几次不同语法的尝试,这是我能想到的最好的方法:

sed -n 's|# <docker-registry>|,|# </docker-registry>|p' $FILE

如果没有s标志,我将得到以下错误:

sed: 1: "|# <docker-registry>|,| ...": invalid command code |

使用s标志,我得到以下错误:

sed: 1: "s|# <docker-registry>|, ...": bad flag in substitute command: '#'

怎样才能达到预期的效果?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-09 16:20:08

您将在stdout上收到结果:

代码语言:javascript
复制
sed -e '/# <docker-registry>/,/# <\/docker-registry>/d' yourdatafile

如果需要编辑数据文件,请使用ed而不是sed。不要使用重定向到您正在读取的文件,因为它可能会损坏文件。

编辑脚本:

代码语言:javascript
复制
/# <docker-registry>/,/# <\/docker-registry>/d
w
q

打电话:

代码语言:javascript
复制
ed yourdatafile <script.ed
票数 1
EN

Stack Overflow用户

发布于 2020-05-09 16:06:21

TL;DR:

代码语言:javascript
复制
sed '/# <docker-registry>/,/# <\/docker-registry>/d' $FILE > "$FILE.tmp"
mv "$FILE.tmp" $FILE

解释:

我在发帖的时候找到了答案,所以在事后:

  1. 为了从sed输出中删除行,在表达式的末尾添加d标志:

sed -n 's|# <docker-registry>|,|# </docker-registry>|d' $FILE

  1. sed产生流。为了覆盖文件,将结果传送到文件:

sed -n 's|# <docker-registry>|,|# </docker-registry>|d' $FILE > $FILE

  1. 通过使用默认分隔符和转义/在结束模式:

可以避免sed: 1: "s|# <docker-registry>|, ...": bad flag in substitute command: '#'错误

sed '/# <docker-registry>/,/# <\/docker-registry>/d' $FILE > $FILE

由于某种原因,

  1. (3)中的上述命令删除了原始文件,并且没有将新内容输送到其中。将其打印到一个新文件中,然后将其移动到旧的文件上,就可以完成任务:

代码语言:javascript
复制
sed '/# <docker-registry>/,/# <\/docker-registry>/d' $FILE > "$FILE.tmp"
mv "$FILE.tmp" $FILE

如果你有一个更优雅的答案,可以随意编辑:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61699739

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档