sed는 구분 기호 사이를 제거하지만 첫 번째 구분 기호는 유지합니다.

sed는 구분 기호 사이를 제거하지만 첫 번째 구분 기호는 유지합니다.

=문자열의 두 번째 문자열과 첫 번째 문자열 /사이의 모든 항목을 제거하고 =제자리에 남겨 두어야 합니다 . 여러 가지를 시도해 보았지만 가장 최근의 것은 다음과 같습니다.

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

정방향/역방향 구성을 지원하지 않으므로 교체 시 캡처 그룹 및 역참조를 사용하세요.

관련 정보