如何使用 sed 将由斜杠分隔的相同数字的两个实例替换为这些数字的一个实例?

如何使用 sed 将由斜杠分隔的相同数字的两个实例替换为这些数字的一个实例?

我想用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

参考

相关内容