首页 > 解决方案 > 如何用 SED (bash) 替换 2 个标签之间的内容?

问题描述

我想用sed(Oracle-Linux/Bash)就地编辑文件。

2 个搜索标签之间的内容(以“#”-comments 的形式)应该被注释掉。

例子:

Some_Values
#NORMAL_LISTENER_START
LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)
         (KEY      = LISTENER)
    )
  )
)
#NORMAL_LISTENER_END
Other_Values

应该导致:

Some_Values    
#NORMAL_LISTENER_START
# LISTENER =
#   (DESCRIPTION =
#     (ADDRESS = (PROTOCOL = IPC)
#          (KEY      = LISTENER)
#     )
#   )
# )
#NORMAL_LISTENER_END
Other_Values

以下命令已经实现了它,但它还在搜索标签前面放置了一个注释+空白:

sed -i "/#NORMAL_LISTENER_START/,/#NORMAL_LISTENER_END/ s/^/# /" ${my_file}

现在我的研究告诉我要排除那些搜索标签,例如:

sed -i '/#NORMAL_LISTENER_START/,/#NORMAL_LISTENER_END/{//!p;} s/^/# /' ${my_file}

但它不起作用 - 结果显示以下消息:

sed:-e 表达式 #1,char 56:命令后的额外字符

我需要这些 SearchTag 保持原样,因为之后我再次需要它们。

标签: awksed

解决方案


如果ed可用/可接受。

printf '%s\n' 'g/#NORMAL_LISTENER_START/+1;/#NORMAL_LISTENER_END/-1s/^/#/' ,p Q | ed -s file.txt
  • 如果您对输出和就地编辑感到满意,请更改Q为。w

  • 删除,p如果您不想看到输出。


推荐阅读