Ras*_*ond 6 sed regular-expression
我找到了 GNU sed 的一个解决方案,我也找到了类似的东西\1,但终端告诉我它“未在 RE 中定义”。
但我想做的是:
如果我有一个看起来像这样的字符串sinder-city1.gif,我想做那个sinder-city.gif,现在我不能直接替换整个字符串,因为我将对许多不同的字符串执行此操作,也不能只删除 .gif 之前的所有数字或其他一些模式,因为如果有
sinder-city2.gif
sinder-city3.gif
Run Code Online (Sandbox Code Playgroud)
我希望他们保持原样。
我不想换那个。为了匹配它,我输入sed 's,[a-z]1.gif,但如果我删除它,我将留下sinder-cit.gif. 我如何匹配y?
我想这样做:
sed 's,[a-z]1.gif,[here is the last letter].gif,g'
Run Code Online (Sandbox Code Playgroud)
它必须在 BSD sed 上工作。
sed 's,\([a-z]\)1\.gif$,\1.gif,g'
Run Code Online (Sandbox Code Playgroud)
或者,如果您想在之前允许任何非数字 1
sed 's,\([^0-9]\)1\.gif$,\1.gif,g'
Run Code Online (Sandbox Code Playgroud)
反斜杠括号构造界定了一个捕获组,FreeBSD 手册页将其称为“括号表达式”(尽管使用了括号——方括号的意思是别的)。请注意,sed 使用基本正则表达式 (BRE),而不是扩展正则表达式 (ERE);手册页描述了 ERE,最后一段解释了 BRE 语法和 ERE 语法之间的区别。我发现POSIX 规范比此处的 BSD 手册页更具可读性;它调用捕获组反向引用表达式。的GNU sed的手动比任一更易读; 只是避免描述为 GNU 扩展的功能。
给定一个捕获组(又名反向引用表达式),您可以在替换文本中使用反斜杠+数字来表示“与相应捕获组匹配的文本”。例如,\1在替换文本中,替换为正则表达式中第一个捕获组匹配的文本。这里有一个捕获组,它捕获1.gif.
我改变1.gif到1\.gif相匹配的点字面上,并且加入了尾随$到仅在该行的末尾匹配。
再举一个捕获组的例子,如果你想对任意扩展进行操作,你可以使用类似的东西
sed 's,\([^0-9]\)1\(\.[^./]*\)$,\1\2,g'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13910 次 |
| 最近记录: |