次の内容を含むファイルがあります。
..\..\src\modules\core\abc\abc.cpp
..\..\src\modules\core\something\xyz\xyz.cpp
..\..\src\other_modules\new_core\something\pqr\pqr.cpp
..\..\src\other_modules\new_core\something\pqr\abc.cpp
私が期待する結果は
..\..\src\abc\abc.cpp
..\..\src\xyz\xyz.cpp
..\..\src\pqr\pqr.cpp
..\..\src\pqr\abc.cpp
sedを使用してどのようにこれを達成できますか?
両方のグループをキャプチャする正規表現を作成することはできません。
- 初期グループ(.... \ src) - すべての行で同じです。
- 変数グループ (abc\abc.cpp) または (xyz\xyz.cpp) または (pqr\pqr.cpp) または (pqr\abc.cpp)
ベストアンサー1
BSDsed
または最新バージョンのGNUを使用するsed
(以前のバージョンの場合-E
に置き換えます-r
):
sed -E 's#(.*\\src).*(\\[^\]+\\[^\]+$)#\1\2#' file.txt
#
入力にsを含むあいまいさを避けるために、置換s
()コマンドの区切り文字として使用されます。sed
\
(.*\\src)
最初から一致を開始しsrc
、一致をキャプチャグループ1に配置します。(\\[^\]+\\[^\]+$)
2つの部分を最後まで\
一致させ、キャプチャグループ2に配置します。.*
先行することは、第1のキャプチャグループと第2のキャプチャグループとの間の全ての項目と一致する。交換では、2つのキャプチャされたグループを使用しました。
POSIXスタイル:
sed 's#\(.*\\src\).*\(\\[^\]\+\\[^\]\+$\)#\1\2#' file.txt
例:
% cat file.txt
..\..\src\modules\core\abc\abc.cpp
..\..\src\modules\core\something\xyz\xyz.cpp
..\..\src\other_modules\new_core\something\pqr\pqr.cpp
..\..\src\other_modules\new_core\something\pqr\abc.cpp
% sed -E 's#(.*\\src).*(\\[^\]+\\[^\]+$)#\1\2#' file.txt
..\..\src\abc\abc.cpp
..\..\src\xyz\xyz.cpp
..\..\src\pqr\pqr.cpp
..\..\src\pqr\abc.cpp