![sed를 사용하여 다양한 숫자 시퀀스를 그대로 유지하면서 문자열의 문자 바꾸기](https://linux55.com/image/165100/sed%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EB%8B%A4%EC%96%91%ED%95%9C%20%EC%88%AB%EC%9E%90%20%EC%8B%9C%ED%80%80%EC%8A%A4%EB%A5%BC%20%EA%B7%B8%EB%8C%80%EB%A1%9C%20%EC%9C%A0%EC%A7%80%ED%95%98%EB%A9%B4%EC%84%9C%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%98%20%EB%AC%B8%EC%9E%90%20%EB%B0%94%EA%BE%B8%EA%B8%B0.png)
다음과 같은 문자와 숫자가 포함된 문자열이 있습니다.
one0.1231two,
나는 바꾸고 싶다하나그리고둘새로운 문자 순서로
three0.1231four,
그 사이의 숫자는 변경되지 않고 유지됩니다. 그러나 두 하위 문자열이하나그리고둘항상 동일하게 유지되지만 그 사이의 숫자 시퀀스 길이는 다양할 수 있습니다.
one0.000230002two, one1293.02two, or one42two
일어날 수 있습니다. 지금까지는 sed와 정규식을 사용하여 고정된 비트 수로만 교체를 수행할 수 있었습니다.
다음과 같은 상황만 발생합니다하나그리고둘위와 같이 주변의 숫자를 교체해야 합니다. 다른 모든 이벤트는 변경되지 않은 상태로 유지되어야 합니다.
답변1
다음을 수행할 수 있습니다.
sed 's/one\([[:digit:].]*\)two/three\1four/g'
이것\(...\)
포착\1
(여기서는 0개 이상의 십진수 또는 마침표 시퀀스) 내에서 일치하므로 대체 항목에서 참조할 수 있습니다.
답변2
다음 sed
대체품을 사용하는 것이 좋습니다.
$ s="one0.000230002two, one1293.02two, or one42two "
$ sed -E 's/([^ 0-9]+)([0-9]+(\.[0-9]+)?)([^ 0-9,]+)/three\2four/g' <<<"$s"
three0.000230002four, three1293.02four, or three42four