sed - SED - 用字符串换行变量替换字符串换行符
问题描述
我在文件中有以下内容
dhcp_option_domain:
- test.domain
我需要做的是:
每当值 'dhcp_option_domain:' 后跟换行符和 ANY 字符串时,将其替换为 'dhcp_option_domain:' 后跟换行符和变量。
即,如果我设置 dhcp_domain="different.com" 的变量,那么上面的字符串将转换为:
dhcp_option_domain:
- different.com
请注意,这两行都有并且需要保持前导 2 个空格。
我不想只在“test.domain”上进行搜索和替换,因为我有一些使用它的情况,并且每次运行 sed 命令时值都可能不同。
我尝试了几种方法,例如:
dhcp_domain="something.com"
sed -i 's|dhcp_option_domain:\n.*|dhcp_option_domain:\n - $dhcp_domain|g' filename
但是不能让它工作。谢谢。
解决方案
正如手册所解释的:
sed
通过对输入的每一行执行以下循环来操作:首先,sed 从输入流中读取一行,删除任何尾随换行符,并将其放入模式空间中。然后执行命令
您的正则表达式 ( dhcp_option_domain:\n.*
) 不匹配,因为\n
首先在模式空间中没有。
一个可能的解决方案:
sed '/dhcp_option_domain:$/{n;c\
- '"$dhcp_domain"'
}'
该/dhcp_option_domain:$/
部分是地址。以下命令仅在与该模式匹配的行上执行。
该{
}
命令将多个命令组合成一个块。
该n
命令打印出当前模式空间并将其替换为下一行输入。
该c\
命令将当前模式空间替换为脚本中的任何内容。这里有点棘手。我们有:
- sed 程序中的文字换行符(在 之后需要
c\
),然后 -
(将这些字符按字面意思放在模式空间中,然后'
(shell 语法的一部分,终止以 开头的单引号部分sed '...
),然后"
(开始一个双引号部分),然后$dhcp_domain
(因为它在双引号中,所以插入了dhcp_domain
shell 变量的内容),然后"
(终止双引号部分),然后'
(开始另一个单引号部分),然后- 再次换行(在 之后终止文本
c\
),然后 }
(关闭由 开始的块{
)。
推荐阅读
- netlogo - 强制海龟(netlogo)保持当前航向(从孵化点开始)而不是跟随其父级的航向和方向
- android - 如何在完成()之后从另一个活动刷新片段中的列表视图?
- pytorch - 未找到 Huggingface 变形金刚 ByteLevelBPETokenizer 分词器
- r - Shiny App 出现错误结果的长度必须为 37849,而不是 0
- c++ - QAbstractSeries 信号被点击,因为类型是 QLineSeries
- c++ - C++: std::vector - std::find & std::distance 查询
- javascript - 带有反应的 Firebase:TypeError:路径必须是字符串。收到未定义
- amazon-s3 - 骆驼 S3 组件上的 deleteAfterRead 所需的权限
- variables - 浏览 Python Crash Course 书。在要测试的类上运行代码并遇到未定义变量错误
- python - 让父母在等待孩子时执行某些操作