=
문자열의 두 번째 문자열과 첫 번째 문자열 /
사이의 모든 항목을 제거하고 =
제자리에 남겨 두어야 합니다 . 여러 가지를 시도해 보았지만 가장 최근의 것은 다음과 같습니다.
sed -i 's/=[^/]*//
답변1
입력/출력 예시 없이 텍스트 설명만 토대로 다음과 같은 결론을 내렸습니다.
$ echo "foo=bar=baz/quux" | sed 's/\(.*=.*\)=.*\/\(.*\)/\1=\2/'
foo=bar=quux
이것이 당신이 원하는 것과 얼마나 가깝나요?
답변2
Lookahead 및 Lookahead 어설션에 대해 쓰기 시작했지만 sed가 이를 지원하지 않는다는 것을 알게 되었습니다! 이렇게 하면 트릭을 수행할 수 있습니다.
sed -i 's!\(=[^=]*=\)[^/]*/!\1!'
- 정규식에서 문자를 사용하고 있으므로
/
명령 구분 기호를s
다음으로 변경합니다.!
\(=[^=]*=\)
=
한 문자와 일치하고 그 뒤에 0개 이상의 다른 문자가 오고 그 뒤에 또 다른 문자가 오는 캡처링 그룹입니다=
. 이 부분은=
말씀하신 것처럼 제거할 하위 문자열 앞에 두 문자가 있는지 확인하는 데 필요합니다 .[^/]*/
구분 기호와 두 번째 구분 기호 사이의 모든 항목과 일치합니다.\1
일치하는 문자열 전체를 캡처 그룹과 일치하는 항목으로 바꿉니다.\(=[^=]*=\)
답변3
이것이 해결책이다perl
$ echo 'foo=bar=baz/quux' | perl -pe 's|^([^=]+=){2}\K[^=/]+/||'
foo=bar=quux
$ echo 'abc=foo=bar=baz/quux' | perl -pe 's|^([^=]+=){2}\K[^=/]+/||'
abc=foo=bar=baz/quux
=
위의 예에서 볼 수 있듯이 삭제는 2nd에서 2nd까지의 텍스트 로만 제한됩니다 ./
^([^=]+=){2}\K
줄의 시작 부분에서 시작하여 뒤에 가2
오는 텍스트가 아닌 시퀀스를 찾습니다 . 대체 문자열의 일부가 아니라 뒤로 보는 것을 의미합니다 .=
=
\K
[^=/]+/
=/
다음으로 끝나는 문자가 아닌 하나 이상을 나타냅니다 ./
- 해당 텍스트가 발견되면 삭제됩니다.
동일한 솔루션sed
$ echo 'foo=bar=baz/quux' | sed -E 's|^(([^=]+=){2})[^=/]+/|\1|'
foo=bar=quux
$ echo 'abc=foo=bar=baz/quux' | sed -E 's|^(([^=]+=){2})[^=/]+/|\1|'
abc=foo=bar=baz/quux
정방향/역방향 구성을 지원하지 않으므로 교체 시 캡처 그룹 및 역참조를 사용하세요.