我遇到了一些正则表达式的问题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
将包含整个单词的行更改Host
为my 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
包含该单词的每一行。结果将在标准输出上给出。Host
replacement text
这[[:<:]]
是一个零长度模式,匹配单词的开头。同样,[[:>:]]
将匹配单词的末尾。这意味着上面的替换将不是用单词Hostname
or替换一行xHost
(除非该单词Host
出现在该行的其他位置)。