设为foo
任意字符串。我必须在文件中搜索所有出现的
\LeftLabel{foo}
并将每个出现替换为
\LeftLabel{\textsf{foo}}
但前提是 foo 不以$
字符开头。如何?
答案1
让我们考虑这个测试文件:
$ cat file
\LeftLabel{foo}
\LeftLabel{$foo}
LeftLabel{foo}
现在,让我们进行替换:
$ sed -E 's|\\LeftLabel\{([^$}][^}]*)\}|\\LeftLabel{\\textsf{\1}}|g' file
\LeftLabel{\textsf{foo}}
\LeftLabel{$foo}
LeftLabel{foo}
怎么运行的
中的替换命令sed
看起来像s|old|new|g
whereold
是一个正则表达式,new
是在其位置替换的内容,最后的命令g
告诉 sed 替换一行中所有出现的此类情况,而不仅仅是第一个。
在我们的命令中,该old
部分如下所示:
\\LeftLabel\{([^$}][^}]*)\}
这匹配\LeftLabel{
后跟除$
or之外的任何字符}
,即[^$}]
后跟任意数量的任何字符 not }
,即[^}]*
后跟 a }
。请注意,其中一些字符前面必须有一个反斜杠,以便 sed 将它们视为普通字符,而不是正则表达式活动字符。另请注意,花括号内的字符括在括号内。括号是正则表达式活动字符,它们告诉 sed 将其中的内容保存为组 1。我们可以在命令部分\1
中引用这些字符。new