我想用sed
这些数字的一个实例替换由斜杠分隔的相同数字的两个实例。我的输入文件有这样的行:
text (1982/1982) text
text (1983/1983) text
text (1984/1984) text
我想要这样的输出:
text (1982) text
text (1983) text
text (1984) text
我必须匹配括号,因为输入文件中可能还有其他由斜杠分隔的数字字符串。
在BB编辑我可以使用搜索模式\(([0-9]{4})/\1\)
和替换模式来做到这一点\(\1\)
。但在sed
等效的扩展正则表达式中似乎不起作用:
echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g'
返回:
text (1984/1984) text
但我想要:
text (1984) text
可以在 中执行此操作的扩展正则表达式是什么sed
?
我使用的是 macOS 内置sed
的。
答案1
OSX 的版本sed
相当烦人(实际上是 BSD 的版本)。我通常通过brew 安装GNU sed
:
$ brew search sed
==> Formulae
gnu-sed ✔ libxdg-basedir minised ssed
==> Casks
eclipse-dsl marsedit
exoduseden microsoft-bing-ads-editor
focused osxfuse-dev
google-adwords-editor physicseditor
lego-mindstorms-education-ev3 prefs-editor
licensed subclassed-mnemosyne
安装它:
$ brew install gnu-sed
然后你可以像这样使用它:
$ gsed ....
瞧,你的例子现在可以运行了:
$ echo 'text (1984/1984) text' | sed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g'
text (1984/1984) text
$ echo 'text (1984/1984) text' | gsed -E 's_\(([0-9]{4})/\1\)_\(\1\)_g'
text (1984) text