sed에서 선택적 접미사를 바꾸는 방법

sed에서 선택적 접미사를 바꾸는 방법

테스트를 위해 2개의 행(선택적 접미사가 있거나 없는)을 사용했습니다(마지막 2개의 열거 요소, D2, E2).

echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -E 's/^(.*),(.*),(.*)((,.*)(,.*)){0,1}$/[\1],\2,\3\5\6/'

[A1],B2,C2
[A2,B2,C2],D2,E2

어디서 그걸 받고 싶어?

[A1],B2,C2
[A2],B2,C2,D2,E2

마지막 두 구성 요소를 선택 사항으로 만들고 발견될 경우를 대비해 끝에 추가하고 싶습니다.

반복되는 {x,y}와 물음표(?)를 사용해 보았지만 sed 찾기 패턴에서 마지막 2개 요소를 실제로 선택 사항으로 만들 수 없었습니다. 패턴을 '^' 및 '$'로 래핑하고 선택 사항이 아닌 패턴을 먼저 시도하는 대신 매우 탐욕스러운 첫 번째 구성 요소가 포함된 선택 패턴만 사용하기 때문에 sed가 매우 탐욕스러운 것 같습니다.

참고: 정규식은 실제로 필요한 것을 단순화한 것이므로 다른 접근 방식으로 이를 극복하는 것은 소용이 없을 수 있습니다. 저는 sed를 사용하여 이 작업을 수행하고 싶습니다. 이 특정 방법은 도구의 요령에 대한 지식을 향상시키기 위한 것이기 때문입니다.

편집: 답변해 주셔서 감사합니다. 이것이 제 목표였습니다.

sed -E 's/^([^,]*),([^,]*),([^,]*)(,[^,]*)?(,[^,]*)?$/[\1],\2,\3\4\5/'

답변1

귀하의 sed 구성의 목적이 무엇인지는 잘 모르겠지만, 귀하가 무엇을 잘못하고 있는지 말씀드릴 수 있습니다.
정규식에서 처음 세 개의 영숫자 조합을 과 일치시키려고 합니다 . sed의 정규식은 "탐욕적"이므로 문자, 숫자 및 쉼표가 단일 조합과 일치하므로 (.*),(.*),(.*)첫 번째 조합은 이미 세 가지 조합과 일치 하므로 쉼표와 일치하는 것이 좋습니다. -자유 문자(예: ([^,]*)), 마녀는 쉼표가 없는 문자와 일치합니다. 명령은 다음과 같습니다.(.*).

echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -E 's/^([^,]*),([^,]*),([^,]*)((,[^,]*)(,[^,]*)){0,1}$/[\1],\2,\3\5\6/'

항상 3개 또는 5개 입력의 조합인 경우 정규식을 다음과 같이 "단축"할 수도 있습니다.

echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -E 's/^([^,]*)(((,[^,]*){2}){1,2})$/[\1]\2/'

하지만 실제로는 사용 사례에 따라 다릅니다. 첫 번째 영숫자 조합
과 일치하고 , 앞에 쉼표가 있는 다음 2개 또는 4개 조합과 일치합니다 (예에서는 ,B2,C2 또는 ,B2,C2,D2,E2 입력).^([^,]*)
((,[^,]*){2})

답변2

OP가 무엇을 달성하려고 하는지 아직 확실하지 않지만 탐욕스럽지 않은 일치를 수행하려면 이 경우 부정 문자 클래스를 사용할 수 있습니다 [^,].

echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | 
    sed -E 's/([^,]+)((,[^,]+){2})((,[^,]+){0,2})/[\1]\2\4/'

[A1],B2,C2
[A2],B2,C2,D2,E2

echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | 
    sed -E 's/([^,]+)((,[^,]+){2})((,[^,]+){0,2})/[\1]\2\5/'

[A1],B2,C2
[A2],B2,C2,E2

각 게임을 따로 캡쳐하면서달리다그것은 또 다른 일입니다 ...

OP가 더 완전한 예를 제공한다면... 아마도 우리 모두가 다시 살펴볼 수 있을 것입니다! 이 운동은 우리에게 좋습니다 ;)

답변3

$ echo -e "A1,B2,C2\nA2,B2,C2,D2,E2" | sed -e 's/[^,]*/[&]/' -e 's/[^,]*/(&)/2' -e 's/[^,]*/{&}/3'
[A1],(B2),{C2}
[A2],(B2),{C2},D2,E2

한 번의 교체로 모든 것을 시도하는 대신 마지막에 숫자 플래그를 사용하여 어떤 게임(여기 /2와 두 번째 및 세 번째 게임) 을 수행할지 선택할 수 있다는 사실을 활용할 수 있습니다 ./3

명확성을 위해 위에 사용된 명령은 다음과 같습니다 sed.

sed -e 's/[^,]*/[&]/' \
    -e 's/[^,]*/(&)/2' \
    -e 's/[^,]*/{&}/3'

관련 정보