如何使用 sed 将整行替换为另一行包含字符的行

如何使用 sed 将整行替换为另一行包含字符的行

该文件第 19 行包含以下内容

send -- "[email protected]\r"

我想更改电子邮件,所以我想出了这个

sed -i.bak '19s/.*/send -- "[email protected]\r"/' ./a

它确实改变了第 19 行,但我得到的是

"end -- "[email protected]

出了什么问题以及如何解决?

答案1

反斜杠是模式中的转义字符sed,因此文字插入回车符。您需要的是\\r- 转义的反斜杠,后跟文字r

答案2

您不需要进行搜索和替换,只需更改第 19 行即可:

sed '19c\send -- "[email protected]\\r"'

答案3

您让事情变得比实际更复杂了 - 只需更改电子邮件地址,而不是整行。为了演示:

$ echo 'send -- "[email protected]\r"'  | sed 's/old@example\.com/[email protected]/'
send -- "[email protected]\r"

顺便说一句,如果搜索模式可能在一行中出现多次,则可以选择g在命令末尾使用(global) 修饰符,如果您想要不区分大小写的搜索,则可以选择使用 (ignore case) 修饰符 - 例如同时使用:。s///is/old@example\.com/[email protected]/ig

无论如何,你的命令将如下所示:

sed -i.bak '19s/old@example\.com/[email protected]/' ./a

如果您不知道要更改的确切行号,请指定正则表达式作为行地址而不是行号:

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/[email protected]/' ./a

更改所有出现的[电子邮件保护]在文件中,不必指定地址,替换将在文件的每一行上进行。

sed -i.bak 's/old@example\.com/[email protected]/' ./a

相关内容