使用带有&符号的sed(&)


19

我使用sed在我拥有的SAS文件中查找和替换模式,而不是单独更改它们。问题是我正在尝试替换宏变量,并且在使用与号时无法正确处理。

Here's my code:
sed -ie 's/user=&uid./user=&sysuserid./g' *_table_*.sas

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

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


6
&是一个特殊字符,因此在RHS中使用时需要转义-在您的情况下,您必须运行, 's/user=&uid./user=\&sysuserid./g'尽管我怀疑您还需要转义LHS中的点以匹配文字点,所以您实际上需要's/user=&uid\./user=\&sysuserid./g'
don_crissti

1
是的,右侧的“&”基本上表示“左侧所有匹配项”,因此请使用“ \”将其转义。您应该做出答案,而不仅仅是评论。
爱德华·福尔克

我没必要逃避第一阶段的经历……只是在任何其他
人中抬起头来就很

Answers:


25

&在替换文本中是特殊的:它表示“输入中与模式匹配的整个部分”,因此您在此处所做的替换user=&uidXuser=user=&uidXsysuserid.。要在替换文本中插入实际的“&”号,请使用\&

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

sed -e 's/user=&uid\./user=\&sysuserid./g'

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

sed -e 's/user=&uid\(.\)/user=\&sysuserid\1/g'

实际上,考虑到原始文本和替换文本之间的重复,您仍然应该使用组:

sed -e 's/\(user=&\)u\(id\.\)/\1sysuser\2/g'

即“替代usysuser之间user=&id.”。


你能解释一下团体吗?
lucasdavis500 '16

2
@ lucasdavis500一组识别模式的一部分。它用反斜杠括起来。例如\(user=&\),一个模式user&将匹配字符串匹配并存储为一个组(组号为1,因为它是该模式中的第一个组)。然后,在替换\1被存储组号1中的字符串替代
吉尔“SO-光阑恶”

您是说(user =&)存储了user =&,而不是user&?
lucasdavis500

@ lucasdavis500我不明白您的评论。字符=正则表达式和替换文本代表自身,所以user=&只匹配user=&,并且user=&在替换文本的产量user=,然后通过正则表达式匹配线的一部分。
吉尔(Gilles)'“ SO-别再邪恶了”

1
@ lucasdavis500 =字符没有任何特殊含义。user=&在替换文本中产生user=后跟原始匹配文本。user=\&在替换文字中产生user=&
吉尔斯'SO-不再是邪恶的'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.