替换 sed 中的 "advanced" 模式

Replace "advanced" pattern in sed

我不知道怎么改:

\usepackage{scrpage2}
\usepackage{pgf} \usepackage[latin1]{inputenc}\usepackage{times}\usepackage[T1]{fontenc}
\usepackage[colorlinks,citecolor=black,filecolor=black,linkcolor=black,urlcolor=black]{hyperref}

仅使用 sed

REPLACED
REPLACED REPLACEDREPLACEDREPLACED
REPLACED

我正在尝试 sed 's!\.*\([.*]\)\?{.\+}!REPLACED!g' FILE

但这给了我

REPLACED
REPLACED
REPLACED

我认为 .* 被使用了,而我的模式中的其他所有内容都被忽略了,但我不知道该怎么做。

在我学会了如何格式化正则表达式之后,我的下一步是将其更改为:

\usepackage{scrpage2}
\usepackage{pgf} 
\usepackage[latin1]{inputenc}
\usepackage{times}
\usepackage[T1]{fontenc}
\usepackage[colorlinks,citecolor=black,filecolor=black,linkcolor=black,urlcolor=black]{hyperref}

所以我也很感激这方面的任何指示。

这里有一些代码恰好适用于您给出的示例:

sed 's/\[^\[:space:]]\+/REPLACED/g'

即匹配一个反斜杠后跟一个或多个不是空格或另一个反斜杠的字符。

为了使事情更具体,您可以使用

sed 's/\[[:alnum:]]\+\(\[[^][]*\]\)\?{[^{}]*}/REPLACED/g'

即匹配反斜杠后跟一个或多个字母数字字符,然后是可选的 [ ] 组,然后是 { } 组。

[ ] 组匹配 [,后跟零个或多个 non-bracket 个字符,后跟 ].

{ } 组匹配 {,后跟零个或多个 non-brace 个字符,后跟 }.

Perl 助你一臂之力!它具有 "frugal quantifiers":

perl -pe 's!\.*?\.?{.+?}!REPLACED!g' FILE

请注意,我删除了捕获组,因为您没有在任何地方使用它。此外,[.*] 匹配一个点或一个星号,但您可能想匹配一个文字点。