sedを使用して、スラッシュで区切られた同じ数の2つのインスタンスをその数の1つのインスタンスに置き換えることはできますか?

sedを使用して、スラッシュで区切られた同じ数の2つのインスタンスをその数の1つのインスタンスに置き換えることはできますか?

sedスラッシュで区切られた同じ数の2つのインスタンスをこの数の1つのインスタンスに置き換えたいと思います。私の入力ファイルには次の行があります。

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

引用する

関連情報