구분 기호 사이를 삭제하지만 첫 번째 구분 기호는 유지하도록 Sed

구분 기호 사이를 삭제하지만 첫 번째 구분 기호는 유지하도록 Sed

=문자열의 두 번째 항목과 /문자열의 첫 번째 항목 사이에 있는 모든 항목을 삭제해야 하지만 =해당 위치는 그대로 유지해야 합니다. 나는 아주 많은 것을 시도했는데 가장 최근의 것은

sed -i 's/=[^/]*//

답변1

샘플 입력/출력 없이 텍스트 설명만 기반으로 다음을 생각해냈습니다.

$ echo "foo=bar=baz/quux" | sed 's/\(.*=.*\)=.*\/\(.*\)/\1=\2/'
foo=bar=quux

그것이 당신이 원하는 것에 얼마나 가깝습니까?

답변2

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

위의 예에서 볼 수 있듯이 이는 2번째부터 2번째까지만 텍스트를 삭제하는 것으로 제한됩니다 =./

  • ^([^=]+=){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

미리보기/뒤돌아보기 구성을 지원하지 않으므로 교체하는 동안 캡처 그룹이 사용되고 역참조됩니다.

관련 정보