将 sed 与符号 (&) 一起使用

Duk*_*uke 35 sed quoting replace

我正在使用 sed 来查找和替换我拥有的 SAS 文件中的模式,而不是单独更改它们。问题是我试图替换宏变量,当我使用&符号时,它没有正确处理。

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas
Run Code Online (Sandbox Code Playgroud)

每当我运行此命令时,它似乎都会附加并使用原始文本执行各种时髦的操作。

问题:如何使用 sed 命令替换包含与号的文本?

Gil*_*il' 37

&在替换文本特殊:它的意思,所以你在这里做替代“是由模式匹配的输入的整个部分”user=&uidXuser=user=&uidXsysuserid.。要在替换文本中插入实际的与号,请使用\&

另一件看起来不对的事情是.在搜索模式中代表任何字符(换行符除外),但.替换文本的末尾是一个文字点。如果您只想替换文字 string user=&uid.,请.使用反斜杠保护。

sed -e 's/user=&uid\./user=\&sysuserid./g'
Run Code Online (Sandbox Code Playgroud)

如果要替换任何一个字符并将其保留在结果中,请将字符放在一个组中并\1在替换中使用以引用该组。

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'
Run Code Online (Sandbox Code Playgroud)

事实上,考虑到原文和替换之间的重复,你无论如何都应该使用组:

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'
Run Code Online (Sandbox Code Playgroud)

即“u由和sysuser之间替换”。user=&id.

  • @lucasdavis500 组标识了模式的一部分。它由反斜杠括号分隔。例如,`\(user=&\)` 是一个匹配`user&` 的模式,并将匹配字符串存储为一个组(组号 1,因为它是模式中的第一个组)。然后在替换中,`\1` 被为组号 1 存储的字符串替换。 (2认同)