Sed 和正则表达式

Sed 和正则表达式

我遇到了一些正则表达式的问题sed

我想更改文件中的一行,所以我这样做了:

sed -i '3s/.*/my new text in file/' file.txt

此扩展正在查找文件中的第三行并更改它。

这个解决方案不好,但我不知道如何构建一个好的常规扩展。假设我正在某个文件中查找“主机”一词。如何构建一个好的常规扩展?

我已经尝试过以下方法:

sed -e '<\H...s>\ /my new text in file/' file.txt'。

我究竟做错了什么?

答案1

尽管似乎几乎没有人使用它,但它sed提供了一个c用于整行替换​​的(更改)命令:

c\ 
text

    Delete the lines matching the address or address-range, and 
    output the lines of text which follow this command.

例如你可以使用

sed '/\bHost\b/c\                      
my new text
' file

将包含整个单词的行更改Hostmy new text.该\b序列表示单词边界,因此它将排除部分匹配,例如Hostname- 在 GNU sed 中,您可以使用\<and\>代替 ie \<Host\>,您也可以将新文本放在一行上:

sed '/\<Host\>/cmy new text' hostfile

这似乎是你在表达中的目标 - 你只是错过了实际的c命令并向后得到了单词边界说明符,即<\. . .>\代替\<. . .\>

答案2

$ sed 's/^.*[[:<:]]Host[[:>:]].*$/replacement text/' file.txt

上面的代码将用字符串替换文件中file.txt包含该单词的每一行。结果将在标准输出上给出。Hostreplacement text

[[:<:]]是一个零长度模式,匹配单词的开头。同样,[[:>:]]将匹配单词的末尾。这意味着上面的替换将不是用单词Hostnameor替换一行xHost(除非该单词Host出现在该行的其他位置)。

相关内容