=
문자열의 두 번째 항목과 /
문자열의 첫 번째 항목 사이에 있는 모든 항목을 삭제해야 하지만 =
해당 위치는 그대로 유지해야 합니다. 나는 아주 많은 것을 시도했는데 가장 최근의 것은
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
미리보기/뒤돌아보기 구성을 지원하지 않으므로 교체하는 동안 캡처 그룹이 사용되고 역참조됩니다.