从文件中获取一定范围的行,并使用 awk 或 sed 或两者替换该范围内的行

从文件中获取一定范围的行,并使用 awk 或 sed 或两者替换该范围内的行

我想使用 awk 或 sed 或两者(如果需要)替换 smb.conf 文件某个部分中的一行。以下是文件中的部分...

[CMI] oplocks = no wide links = no writeable = yes delete readonly = yes path = /LOCALSITE/CMI comment = CMI Data write list = @cbishare valid users = @cbishare create mode = 775 directory mode = 775

我希望以后能用这个代码重用,并使用变量在 smb.conf 文件的不同部分上运行。因此,仅在每个部分中查找“写入列表”是行不通的。

我可以使用此代码解析该文件并获取该部分...

awk '/\[\CMI\>\]/,/^$/' /etc/samba/smb.conf

或者使用 sed...

sed -n '/\[\CMI\>\]/,/^$/{p}' /etc/samba/smb.conf

我现在需要在文件中替换该范围内的特定行,例如“写入列表”。我是 sed 或 awk 的新手,我还没有找到有关如何完成最后一部分的任何信息。

我想也许我可以得到该行的 NR,然后使用 sed 重写它。

如果您能提供关于如何执行此操作的任何想法或解决方案的链接,我们将不胜感激。

答案1

sed

要替换 CMI 部分中“写入列表”的值(仅替换 CMI 部分):

sed '/\[\CMI\>\]/,/^$/ s/\s*write list =.*/ write list = New Value/' smb.conf

write list这将用 替换的旧值New Value。它假定 中的部分smb.conf以空行结尾,正如您的代码中所假设的那样。

awk

相似地:

awk '/\[\CMI\>\]/,/^$/ {if ($1=="write" && $2=="list") {$0=" write list = New Value"}} 1' smb.conf

相关内容